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

前端之家收集整理的这篇文章主要介绍了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的部分可能是指类方法函数指针.这仍应适用于全球职能.

猜你在找的C#相关文章