Ограничение 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
Добро пожаловать.
—СА