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

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

概述关于本机/托管互 *** 作的大量错误信息让我感到困惑. 我有一个常规的C语言,它不是使用CLR构建的(它既不是托管C也不是C/C++LI,永远不会).这个C exe是“负责”,它没有托管包装. 我想从我的C exe访问C#程序集中的一些代码.我可以使用COM从我的C代码访问C#程序集.但是,当我的C#代码检测到一个事件时,我希望它回调到我的C代码中.将在运行时提供要回调的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. @H_404_46@

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

总结

以上是内存溢出为你收集整理的c# – 从托管.NET代码调用本机回调(使用COM加载托管代码时)全部内容,希望文章能够帮你解决c# – 从托管.NET代码调用本机回调(使用COM加载托管代码时)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1262275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存