我找到了将托管代码导出为非托管的库,因此您可以使用非托管语言(如C / C ++)来使用它。但我没有找到任何可以解释它是如何完成的(这是我更感兴趣的)
我正在寻找信息,教程,文章,代码来源或任何可以帮助我理解其工作原理的内容
另外,如果您在书签中找到了一些钩子/绕道资源,我也很乐意阅读它们:)
提前致谢并度过美好的一天。
答案 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.dll
和RGiesecke.DllExport.MSBuild.dll
。 UnmanagedExports
的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)