我会发一个答案,收集我写的评论.
最着名的图书馆是(如今)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安装在程序包中\ UnmanagedExports.1.2.6\tools文件夹):RGiesecke.DllExport.dll和RGiesecke.DllExport.MSBuild.dll.nuget安装程序为csproj UnmanagedExports添加了一些行,如:
<Import Project="packages/UnmanagedExports.1.2.6/tools/RGiesecke.DllExport.targets" Condition="Exists('packages/UnmanagedExports.1.2.6/tools/RGiesecke.DllExport.targets')" />
Run Code Online (Sandbox Code Playgroud)
导致程序RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask集中包含的类的执行RGiesecke.DllExport.MSBuild.dll.这个类使用该程序只是调用Mono.Cecil,重写组件进行一些代码重新编织.ildasm生成il代码源,修改il代码源,然后用于ilasm生成"原始".dll/.exe.所以简单地说,生成两个程序集,一个用<Import />另一个用<Import />注释掉,然后做一个
ildasm yourdll.dll /out=source.il
Run Code Online (Sandbox Code Playgroud)
两个文件并将其与您最喜欢的文件比较器进行比较.
另一个有趣的链接在这里.有一些评论如何使它在x64上工作.
如果我必须构建类似的东西,我可能会尝试将它集成到Fody.通过这种方式,我可以免费获得整个后期构建任务(因为它是由Fody完成的)
无法完成Mono.Cecil... Mono.Cecil无法编写混合模式程序集(导出符号所需).你必须使用UnmanagedExports(以及其他各种例子)使用的相同"技巧"...生成IL文件,修改它(它是一个固定格式的文本文件......很容易修改),重新 - 生成.dll/.exe.
| 归档时间: |
|
| 查看次数: |
6752 次 |
| 最近记录: |