【问题标题】:Changing a C# delegate's calling convention to CDECL将 C# 委托的调用约定更改为 CDECL
【发布时间】:2011-07-06 12:37:06
【问题描述】:

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

【问题讨论】:

    标签: c# c++ interop pinvoke calling-convention


    【解决方案1】:

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

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

    【讨论】:

    • 我可以给它分配一个普通的 C# 函数吗?
    • 非常感谢。完美运行。你拯救了我的一天!
    • 顺便说一句,你可以在 vb.net 中做到这一点: Public Delegate Sub my_callback_function(ByRef v As my_struct)
    猜你喜欢
    • 2012-03-17
    • 2023-03-28
    • 2015-04-16
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多