加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从托管.NET代码调用本机回调(使用COM加载托管代码时)

发布时间:2020-12-15 04:11:16 所属栏目:百科 来源:网络整理
导读:关于本机/托管互操作的大量错误信息让我感到困惑. 我有一个常规的C语言,它不是使用CLR构建的(它既不是托管C也不是C/C++LI,永远不会).这个C exe是“负责”,它没有托管包装. 我想从我的C exe访问C#程序集中的一些代码.我可以使用COM从我的C代码访问C#程序集.但
关于本机/托管互操作的大量错误信息让我感到困惑.

我有一个常规的C语言,它不是使用CLR构建的(它既不是托管C也不是C/C++LI,永远不会).这个C exe是“负责”,它没有托管包装.

我想从我的C exe访问C#程序集中的一些代码.我可以使用COM从我的C代码访问C#程序集.但是,当我的C#代码检测到一个事件时,我希望它回调到我的C代码中.将在运行时提供要回调的C函数指针.请注意,C函数指针指向exe执行环境中的函数.它可以使用那里的静态成员.我不希望托管代码尝试加载一些DLL来调用函数(没有DLL).

如何通过COM / .NET将此C函数指针传递给我的C#代码并让我的C#代码成功调用它?

谢谢!

解决方法

您可能想要使用 Marshal.GetDelegateForFunctionPointer

>创建一个与本机函数签名匹配的委托类型,记住编组类型的正确方法并根据需要使用MarshalAs
>将本机代码中的本机函数指针与C#代码进行通信,但是您可以(在您的情况下,看起来您可以使用COM – > C#连接)
>使用Marshal.GetDelegateForFunctionPointer将指针转换为C#可调用委托
>使用您的参数调用委托

张俊峰有一个这样做的例子here.

请注意MSDN上提到的限制:

The GetDelegateForFunctionPointer
method has the following restrictions:

  • Generics are not supported in interop
    scenarios.
  • You cannot pass an invalid function
    pointer to this method.
  • You can use this method only for pure
    unmanaged function pointers.
  • You cannot use this method with
    function pointers obtained through C++
    or from the GetFunctionPointer method.
  • You cannot use this method to create a
    delegate from a function pointer to
    another managed delegate.

关于C的部分可能是指类方法的函数指针.这仍应适用于全球职能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读