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

当我使用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专家,请帮我解决臀部疼痛:)

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

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void MyDelegate();