关于本机/托管互操作的大量错误信息让我感到困惑.
我有一个常规的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.