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

23

当我使用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个回答

52

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

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

我可以将普通的C#函数分配给它吗? - Armen Tsirunyan
顺便提一下,您可以在vb.net中完成它:<UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)> Public Delegate Sub my_callback_function(ByRef v As my_struct) - sailfish009

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接