C#非托管dll导出(工作方式)
本文关键字:工作 方式 导出 dll | 更新日期: 2023-09-27 18:00:47
我发现了一些库,这些库会将托管代码导出为非托管,这样您就可以由C/C++等未托管 我正在寻找信息、教程、文章、代码源或任何可以帮助我了解如何工作的东西 顺便说一句,如果你在书签中发现了一些钩子/弯路资源,我也很乐意阅读:) 提前感谢,祝你度过美好的一天。
我会发布一个答案,收集我写的评论。
最著名的库是(和今天一样)UnmanagedExports。它的页面是https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports。遗憾的是,没有可用的源代码,但它是根据麻省理工学院的许可证授权的,所以使用IlSpy来查看它可能是可以的。
关于它是如何做到的,有一些参考资料。
关于Codeproject,至少有两篇文章:如何自动导出。NET函数到似乎适用于的非托管程序。NET 2.0和Unmanaged代码可以包装令人遗憾的托管方法。净1.1。
《专家》一书中有一些参考资料。NET 2.0 IL汇编程序。
你当然可以做另一件事:观察UnmanagedExports
的作用:UnmanagedExports
最终由两部分"组成":一个包含"愚蠢"属性DllExportAttribute
的程序集RGiesecke.DllExport.Metadata.dll
加上两个程序集(在我的计算机上,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')" />
其导致包含在程序集CCD_ 9中的类CCD_这个类使用这个程序只需调用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所做的那样。