C# 调用C+时出现异常+;来自托管代码的函数 让我们想象一下DLL中的C++函数: typedef结构 { 整数; 作废*清单; }克利斯特; 外部“C”DLL\uAPI客户端获取项(INTA); DLL\U API clist\u t GetItems(int a) { 静态客户列表; list.number=a; 例如:某物; 退货清单; }

C# 调用C+时出现异常+;来自托管代码的函数 让我们想象一下DLL中的C++函数: typedef结构 { 整数; 作废*清单; }克利斯特; 外部“C”DLL\uAPI客户端获取项(INTA); DLL\U API clist\u t GetItems(int a) { 静态客户列表; list.number=a; 例如:某物; 退货清单; },c#,interop,C#,Interop,以及调用此函数的C#代码: [StructLayout(LayoutKind.Sequential)] 公共结构客户端 { 公共整数; 公共IntPtr; }; [非托管函数指针(CallingConvention.Cdecl)] 私有委托CList GetItemsDelegate(int a); int func=Win32APIWrapper.GetProcAddress(m_dllHndl,“GetItems”); 私有GetItemsDelegate GeItemsFunc= (Get

以及调用此函数的C#代码:

[StructLayout(LayoutKind.Sequential)]
公共结构客户端
{
公共整数;
公共IntPtr;
};
[非托管函数指针(CallingConvention.Cdecl)]
私有委托CList GetItemsDelegate(int a);
int func=Win32APIWrapper.GetProcAddress(m_dllHndl,“GetItems”);
私有GetItemsDelegate GeItemsFunc=
(GetItmsDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)func,typeof(GetItemsDelegate));

CList list=GetItemsFunc(12);//list.list是通过封送接口传回的未初始化的void*。我猜这会导致一个问题,因为编组将访问指针。对不起,我没有提到这只是一段代码。此ptr实际上已正确初始化。返回指针的函数总是可疑的。用a调用未定义的行为是传统的C错误。当pinvoke marshaller的堆栈帧覆盖变量时,这将使你的程序与AVE一起崩溃。很抱歉,我还没有看到问题。Dll函数返回clist_t结构,该结构将在返回时由封送拆收器映射到clist。这里有两个大小匹配的字段。与list.number和list.list的值无关。对吗?这是因为非托管DLL中的内存与mmanaged(C#)内存位于不同的空间。您需要对返回值进行马歇尔处理,以将其放入C#“内存空间”。看看这个