C#unmanaged dll导出(如何工作)

时间:2015-07-01 08:42:40

标签: c# export hook unmanaged managed

我找到了将托管代码导出为非托管的库,因此您可以使用非托管语言(如C / C ++)来使用它。但我没有找到任何可以解释它是如何完成的(这是我更感兴趣的)

我正在寻找信息,教程,文章,代码来源或任何可以帮助我理解其工作原理的内容

另外,如果您在书签中找到了一些钩子/绕道资源,我也很乐意阅读它们:)

提前致谢并度过美好的一天。

2 个答案:

答案 0 :(得分:7)

我会发一个答案,收集我写的评论。

最着名的图书馆是(如今)UnmanagedExports。其页面为https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports。遗憾的是,没有可用的源代码,但它是根据MIT许可证授权的,因此可以使用IlSpy来查看它。

有一些关于如何完成的参考文献。

至少有两篇关于Codeproject的文章:How to Automate Exporting .NET Function to Unmanaged Programs似乎适用于.NET 2.0和Unmanaged code can wrap managed methods,遗憾的是关于.NET 1.1。

第384页的Expert .NET 2.0 IL Assembler一书中有一些参考资料。

你肯定可以做另一件事:观察UnmanagedExports做什么:UnmanagedExports到底是由两部分“组成”:一个包含“愚蠢”属性的RGiesecke.DllExport.Metadata.dll DllExportAttribute 1}}加上两个程序集(在我的计算机上,nuget安装在 packages \ UnmanagedExports.1.2.6 \ tools 文件夹中):RGiesecke.DllExport.dllRGiesecke.DllExport.MSBuild.dllUnmanagedExports的nuget安装程序为csproj添加了一些行,如:

<Import Project="packages/UnmanagedExports.1.2.6/tools/RGiesecke.DllExport.targets" Condition="Exists('packages/UnmanagedExports.1.2.6/tools/RGiesecke.DllExport.targets')" />

导致程序集RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask中包含的类RGiesecke.DllExport.MSBuild.dll的执行。 这个类使用Mono.Cecil重写了一些代码重新编写的程序集。 该程序只需调用ildasm生成il代码源,修改il代码源,然后使用ilasm生成“原始”.dll / .exe。所以简单地说,生成两个程序集,一个包含<Import />,另一个包含<Import />注释掉,然后执行

ildasm yourdll.dll /out=source.il

这两个文件并将其与您喜欢的文件比较器进行比较。

另一个有趣的链接是here。关于如何使其在x64上运行,有一些注释。

如果我必须构建类似的东西,我可能会尝试将它集成到Fody。通过这种方式,我可以免费获得整个后期构建任务(因为它是由Fody完成的)

无法使用Mono.Cecil ... Mono.Cecil无法编写混合模式程序集(导出符号所需)。你必须使用UnmanagedExports(以及其他各种例子)使用的相同“技巧”...生成IL文件,修改它(它是一个固定格式的文本文件......很容易修改),重新 - 生成.dll / .exe。

答案 1 :(得分:6)

以下是在github上维护的非托管导出的源代码:

https://github.com/3F/DllExport

非托管导出必须基本上是c ++ / cli编译器必须为反向pinvoke做的事情。