Nilesh bhope Ответов: 0

Ограничение PInvoke: не может возвращать варианты.


Я получаю исключение при вызове библиотеки dll C# для
[DllExport(CallingConvention = CallingConvention.Cdecl)]
        public static int SetSiteInterface(IntPtr siteInterfacePtr)
        {
            try
            {
                gSite = (SiteInterface)Marshal.PtrToStructure(siteInterfacePtr, typeof(SiteInterface));
            }
            catch(Exception ex)
            {
                
            }
            return 1;
        }


как ограничение PInvoke: не может возвращать варианты. PtrToStructure не работает.

gSite-это SiteInterface следующим образом:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct SiteInterface
    {
        public int nStructSize;
        public delegate int GetArraySizeDelegate();
        public GetArraySizeDelegate GetArraySize;
        //C++ TO C# CONVERTER WARNING: C# has no equivalent to methods returning pointers to value types:
        //ORIGINAL LINE: float * (*GetStockArray)(int nType);
        public delegate float GetStockArrayDelegate(int nType);
        public GetStockArrayDelegate GetStockArray;
        public delegate AmiVar GetVariableDelegate(string pszName);
        public GetVariableDelegate GetVariable;
        public delegate void SetVariableDelegate(string pszName, AmiVar newValue);
        public SetVariableDelegate SetVariable;
        public delegate AmiVar CallFunctionDelegate(string szName, int nNumArgs, AmiVar ArgsTable);
        public CallFunctionDelegate CallFunction;
        public delegate AmiVar AllocArrayResultDelegate();
        public AllocArrayResultDelegate AllocArrayResult;
        public delegate object AllocDelegate(uint nSize);
        public AllocDelegate Alloc;
        public delegate void FreeDelegate(object pMemory);
        public FreeDelegate Free;
        public delegate int GetDateTimeArrayDelegate(); // new in 5.30
        public GetDateTimeArrayDelegate GetDateTimeArray;
    }


Приведенный выше код интерфейса сайта C# был преобразован из кода C++, как показано ниже:

struct SiteInterface
{
                int         nStructSize;
                int         (*GetArraySize) (void);
                float *     (*GetStockArray)( int nType );
                AmiVar      (*GetVariable) ( const char *pszName );
                void        (*SetVariable) ( const char *pszName, AmiVar newValue );
                AmiVar      (*CallFunction) ( const char *szName, int nNumArgs, AmiVar *ArgsTable );
                AmiVar      (*AllocArrayResult) (void);
                void *      (*Alloc) (unsigned int nSize);
                void        (*Free) (void *pMemory);
                DATE_TIME_INT* (*GetDateTimeArray) (void);    // new in 5.30
};


PLUGINAPI int SetSiteInterface( struct SiteInterface *pInterface )
{
	gSite = *pInterface;

	return TRUE;
}


Что я здесь делаю не так? Пожалуйста, дайте мне знать, если у вас есть ответ.

Sergey Alexandrovich Kryukov

Я бы сказал, "неправильно" это все изобретение вариантных типов. Я называю это 3-м худшим изобретением (приблизительно, и только считая широко распространенные концепции) за всю историю вычислительной техники. Это не ваша вина,но я бы посоветовал избегать вариантов.
—СА

Nilesh bhope

значит, в C#нет эквивалентного решения?

Sergey Alexandrovich Kryukov

Я так не думаю, и я думаю, что это причина: разработчики .NET не так глупы, как люди, которые изобрели типы вариантов. Таким образом, создатели .NET, вероятно, использовали тот же принцип, который я предлагаю: избегая иметь дело с типами вариантов. Я бы сказал, что это мудрое решение. Если кто-то знает, как с ними справиться, пусть этот человек поправит меня. Я сомневаюсь, что существует четкое и надежное решение.

Известно, что вариант маршалируется как система.Объект: https://msdn.microsoft.com/en-us/library/aa719104%28VS.71%29.aspx.

Возможно, вы можете использовать отражение типа объекта и извлекать его члены, а затем извлекать сами вариантные данные. Я бы не стал тратить на это время...

—СА

Nilesh bhope

Я согласен с вашим предложением. Спасибо. Я займусь этим.

Sergey Alexandrovich Kryukov

Добро пожаловать.
—СА

0 Ответов