gpt4 book ai didi

c# - 将 C# 委托(delegate)的调用约定更改为 CDECL

转载 作者:IT老高 更新时间:2023-10-28 21:45:14 25 4
gpt4 key购买 nike

我在使用 DotNet1.1 时遇到过这个 C# 问题

问题是这样的。我有一个非托管 dll,它有一个带有函数指针(以及其他参数)的函数。当我在 C# 代码中声明 DLLImport 时,我传递了一个委托(delegate)。但是 C# 中的委托(delegate)具有 stdcall 调用约定,而非托管函数需要 cdecl 函数指针。因此,我天真的方法导致了崩溃。然后我发现了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx有人编写了一个出色的库,据我所知,它可以通过 MSIL-hacking 更改委托(delegate)的调用约定。事情进展顺利,直到...

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

所以,SO专家,请帮我解决我的臀部疼痛:)

最佳答案

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

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

关于c# - 将 C# 委托(delegate)的调用约定更改为 CDECL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5155180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com