Tag: marshalling

C#中的封送C数组

可能重复: 在c#中编组c结构 实际C结构: typedef struct procedure { char code[8]; }procedure; typedef struct p45_cldxed24 { procedure p45_cldxed[8]; }p45_cldxed24; p45_cldxed24的等效C#结构是什么? 具体来说,你将如何编组arrays? 检查一下 它是否正确? [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] struct p45_cldxed24 { [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct,SizeConst = 8,SizeParamIndex=0)] procedure[] p45_cldxed; }

C#与非托管C库之间的互操作

我在DLL中有一个小C库,我需要调用它的一些方法。 它使用指针和一些结构,但在其他方面非常简单。 问题是我在.NET与非托管世界的互操作上并不是非常了解,到目前为止我的尝试仍然存在内存访问冲突exception(可能是因为我没有得到指针非常正确)。 有没有人能给我一些指针(哦,双关语!)以最好的方式来解决这个问题? 谢谢 extern vconfig_t *Pobsopen(Ppoly_t ** obstacles, int n_obstacles); extern int Pobspath(vconfig_t * config, Ppoint_t p0, int poly0, Ppoint_t p1, int poly1, Ppolyline_t * output_route); extern void Pobsclose(vconfig_t * config); struct vconfig_t { int Npoly; int N; Ppoint_t *P; int *start; int *next; int *prev; }; typedef struct Ppoly_t { Ppoint_t *ps; […]

如何使用WCHAR * out参数从C#调用C函数?

我在编组方面遇到了一些问题,我自己也搞不清楚了。 我已经搜索了这个主题,但还没有运气,所以基本上我试图从我的托管C#应用程序调用非托管C函数。 C函数的签名如下所示: long MyFunction(WCHAR* upn, long upnSize, WCHAR* guid, long* guidSize); 我没有访问.dll文件,我只知道该函数正在暴露使用,我知道函数应该做什么,但我不知道里面发生了什么,所以函数收到一个WCHAR * upn持有UserPricipalName和长度与提供的UPN的长度。 还传递WCHAR指针,其中该函数写回与传递的UPN相关联的相应GUID。 guidSize指针提供指针的大小,如果它太小,则写入的GUID未完全写入。 如果一切顺利,函数应返回0(当从c#调用时,它从未发生过) 现在我调用和调用此函数的努力如下所示: [DllImport(@”MyDll.dll”, EntryPoint = “MyFunction”, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public static extern long MyFunction(IntPtr upnPtr, long upnSize, [Out, MarshalAsAttribute(UnmanagedType.LPWStr) ] StringBuilder guidPtr, IntPtr guidSizePtr); //my attempt to call the Dll’s exposed function string upn = […]