将 C# 方法暴露给非托管

Posted

技术标签:

【中文标题】将 C# 方法暴露给非托管【英文标题】:exposing C# methods to unmanaged 【发布时间】:2012-03-22 12:57:36 【问题描述】:

“可能重复”中的方法与书中的方法不同。本书的方法是在编译后通过反编译、重新编译过程扩展托管 .dll。您认为完全重复的方法实际上是一种预编译技术。我更喜欢书中的方法,因为它在风格上更像是 AOP。不过感谢您的链接。我也会探索这条路

Expert .NET 2.0 IL Assembler 中,第 18 章第 387 页,Serge Lidin 谈到了创造性的往返。他说,“ILAsm 允许您将托管方法导出为非托管 入口点”。

我在其他任何地方都没有听说过这个话题。这是你可以在 PostSharp 中做的事情吗?是否有任何可下载的使用此技术的代码/脚本示例?

澄清一下,我不想使用 COM 或托管 C++。那么,通过 thunking 从 C/C++ 实现对 C# 方法的调用的最佳方法是什么?

【问题讨论】:

@PaulSasik:这种方法与书中的方法不同。本书的方法是在编译后扩展托管的 .dll。这种方法是预编译。我更喜欢书中的方法,因为它在风格上更像是 AOP。不过感谢您的链接。我也会探索这条路。 bottom answer of that question 链接到 Unmanaged Exports,这听起来像是您的引文。 @Rup:是的。感谢您指出了这一点。可惜没有可用的可下载示例。 没有可用的可下载示例是什么意思?我已经从罗伯特的网站下载了代码。效果很好。 @DavidHefferman:在我看起来以为我完全知道那个链接上的内容之前,我正在做某事并输入了内容。我没有。我也下载了那个。它运作良好?那太棒了。迫不及待想试一试。托管代码是否也表现良好? 【参考方案1】:

ildasm,更改 corflags,添加 v-table 信息和导出功能,ilasm 就完成了。

这是一篇代码项目文章: http://www.codeproject.com/Articles/37675/Simple-Method-of-DLL-Export-without-C-CLI

基于:

死链接: http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

用于死链接的 Wayback Machine: https://web.archive.org/web/20140213030149/http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

这是基于: http://www.amazon.com/Inside-Microsoft-NET-IL-Assembler/dp/0735615470(你指的书的第一版)

【讨论】:

以上是关于将 C# 方法暴露给非托管的主要内容,如果未能解决你的问题,请参考以下文章

通过引用从 c# 将 char** 传递给非托管 C++

将回调参数从 C# 传递到非托管 C++

将托管类中包含的非托管指针字段传递给非托管代码

将非托管 c++ 类库暴露给 c#

将多维数组从托管代码传递到非托管代码

使用 COM 互操作从非托管 C++ 访问 c# 属性