我发现可以将托管代码导出为非托管的库,因此您可以通过非托管语言(例如C/C++)使用它。但是我没有找到任何可以解释其完成方式的信息(这是我更感兴趣的)
我正在寻找信息,教程,文章,代码源或任何可以帮助我了解其工作原理的内容
附带一提,如果您在书签中找到了一些弯钩/弯路资源,我也很想阅读它们:)
在此先感谢您,祝您度过愉快的一天。
最佳答案
我将发布答案,收集我写的评论。
迄今为止最著名的图书馆是UnmanagedExports。它的页面是https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports。遗憾的是,没有可用的源代码,但是它已获得MIT许可,因此可以使用IlSpy进行查看。
有一些关于它如何完成的引用。
关于Codeproject至少有两篇文章:似乎适用于.NET 2.0的How to Automate Exporting .NET Function to Unmanaged Programs和可悲的是有关.NET 1.1的Unmanaged code can wrap managed methods。
第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.DllExportAppDomainIsolatedTask
中包含的类RGiesecke.DllExport.MSBuild.dll
。此类使用Mono.Cecil
重写了程序集,进行了一些代码重新编织。该程序仅调用ildasm
生成il代码源,修改il代码源,然后使用ilasm
生成回“原始” .dll/.exe。简而言之,生成两个程序集,一个带有<Import />
,另一个带有<Import />
的注释,然后执行ildasm yourdll.dll /out=source.il
并将这两个文件与您喜欢的文件比较器进行比较。
另一个有趣的链接是here。关于如何使其在x64上运行,有一些评论。
如果必须构建类似的东西,我可能会尝试将其集成到Fody。这样,我将免费获得整个构建后任务(因为它是由Fody完成的)
Mono.Cecil
无法完成... Mono.Cecil
无法编写混合模式程序集(导出符号所需)。您必须使用UnmanagedExports(以及其他各种示例)所使用的相同“技巧” ...生成IL文件,对其进行修改(它是固定格式的文本文件...非常容易修改),重新-生成.dll/.exe。关于C#非托管DLL导出(工作方式),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31156523/