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

关于本机/托管互操作的大量错误信息让我感到困惑.

我有一个常规的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的部分可能是指类方法函数指针.这仍应适用于全球职能.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...