我在使用DotNet1.1时C#也遇到过这个问题
问题是这样的。我有一个非托管 dll,它有一个接受函数指针(以及其他参数)的函数。当我在 C# 代码中声明 DLLImport 时,我传递了一个委托。但是 C# 中的代表有stdcall
调用约定,而非托管函数需要一个cdecl
函数指针。因此,我幼稚的方法导致了崩溃。然后我发现了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx http://www.codeproject.com/KB/cs/cdeclcallback.aspx有人编写了一个出色的库,据我所知,它可以通过 MSIL 黑客来更改委托的调用约定。一切都很顺利,直到……
我迁移到VS2008和新版本的.NET。在此版本下,上述库不起作用。我并不是真正的 C# 或 .NET 专家,而且说实话,我几乎不了解他的库的用途(尽管它是开源的),所以我什至不想尝试使其适应新的 .NET。不过,我希望新版本的 C# 对于我的问题有更好的解决方案。
所以,专家们,请帮助我解决臀部疼痛:)
默认情况下,p/invoke 系统将您的委托包装在 stdcall 函数中。您可以使用以下命令更改生成的包装器的调用约定UnmanagedFunctionPointer http://msdn.microsoft.com/en-us/library/vstudio/system.runtime.interopservices.unmanagedfunctionpointerattribute.aspx属性:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)