我发现可以将托管代码导出为非托管的库,因此您可以通过非托管语言(例如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.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')" />

导致执行程序集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/

10-09 07:25