繁体   English   中英

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

[英]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.dllRGiesecke.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。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM