将C#委托的调用约定更改为CDECL

Arm*_*yan 21 c# c++ pinvoke interop calling-convention

当我使用DotNet1.1时,我遇到了C#的这个问题

问题是这个.我有一个非托管的DLL,它有一个函数,它接受一个函数指针(以及其他参数).当我在C#代码中声明DLLImport时,我传递了一个委托.但是C#中的委托具有stdcall调用约定,而非托管函数需要cdecl函数指针.因此,我天真的做法导致了崩溃.然后我找到了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx有些人编写了一个优秀的库,可以根据我的理解改变代理的调用约定,MSIL-hacking.事情进展顺利,直到......

我迁移到VS2008和新版本的.NET.在此版本下,上述库不起作用.我不是真正的C#或.NET专家,说实话,我几乎不了解他的库做了什么(虽然它是开源的),所以我甚至不想尝试将它适应新的.NET.但是,我希望更新版本的C#可以为我的问题提供更好的解决方案.

那么,SO专家,请帮我解决臀部疼痛:)

Dav*_*nan 46

默认情况下,p/invoke系统将您的委托包装在stdcall函数中.您可以使用以下UnmanagedFunctionPointer属性更改生成的包装器的调用约定:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();
Run Code Online (Sandbox Code Playgroud)