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

时间:2011-03-01 13:34:19

标签: c# c++ interop pinvoke 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专家,请帮我解决臀部疼痛问题:)

1 个答案:

答案 0 :(得分:45)

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

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