C#非托管dll导出(工作方式)

本文关键字:工作 方式 导出 dll | 更新日期: 2023-09-27 18:00:47

我发现了一些库,这些库会将托管代码导出为非托管,这样您就可以由C/C++等未托管

我正在寻找信息、教程、文章、代码源或任何可以帮助我了解如何工作的东西

顺便说一句,如果你在书签中发现了一些钩子/弯路资源,我也很乐意阅读:)

提前感谢,祝你度过美好的一天。

C#非托管dll导出(工作方式)

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

最著名的库是(和今天一样)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.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')" />

其导致包含在程序集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所做的那样。