[英]C# unmanaged dll exporting (how it works)
我发现,将托管代码导出为不受管理的 ,所以你可以像C / C ++语言的非托管使用库。 但我没有找到任何可以解释它是如何完成的(这是我更感兴趣的)
我正在寻找信息,教程,文章,代码源或任何可以帮助我理解其工作原理的东西
另外,如果您在书签中找到了一些钩子/绕道资源,我也很乐意阅读它们:)
在此先感谢您,祝您度过愉快的一天。
我会发一个答案,收集我写的评论。
最着名的图书馆是(如今) UnmanagedExports 。 其页面为https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports 。 遗憾的是,没有可用的源代码,但它是根据MIT许可证授权的,因此可以使用IlSpy来查看它。
关于它是如何完成的,有一些参考文献。
Codeproject上至少有两篇文章: 如何自动将.NET函数导出到非托管程序 ,似乎是针对.NET 2.0和非托管代码可以包装托管方法 ,遗憾的是.NET 1.1。
第384页的Expert .NET 2.0 IL Assembler一书中有一些参考。
你肯定可以做另一件事:观察UnmanagedExports
作用: UnmanagedExports
最终由两部分“组成”:一个程序集RGiesecke.DllExport.Metadata.dll
包含一个“愚蠢”属性DllExportAttribute
加上两个程序集(在我的计算机上的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.dll
包含的类RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask
的执行。
这个类使用
该程序只需调用Mono.Cecil
重写了一些代码重新编写的程序集。
ildasm
来生成il代码源,修改il代码源,然后使用ilasm
生成“原始”.dll / .exe。 所以简单地说,生成两个程序集,一个用<Import />
,另一个用<Import />
注释掉,然后做一个
ildasm yourdll.dll /out=source.il
两个文件并将其与您最喜欢的文件比较器进行比较。
另一个有趣的链接在这里 。 有一些评论如何使它在x64上工作。
如果我必须构建类似的东西,我可能会尝试将它集成到
Fody 。
通过这种方式,我可以免费获得整个后期构建任务(因为它是由Fody完成的)
无法使用Mono.Cecil
... Mono.Cecil
无法编写混合模式程序集(导出符号所需)。 你必须使用UnmanagedExports(以及其他各种例子)使用的相同“技巧”...生成IL文件,修改它(它是一个固定格式的文本文件......很容易修改),重新 - 生成.dll / .exe。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.