我找到了一些库,可以将托管代码导出为非托管代码,以便您可以在像C/C++这样的非托管语言中使用它。但是我没有找到任何解释如何完成此操作的内容(这是我更感兴趣的内容)。
我正在寻找信息、教程、文章、代码源或任何可以帮助我理解这个过程的东西。
另外,如果你在你的书签中发现了一些钩子/拦截资源,我也很想阅读它们 :)
提前感谢并祝您拥有愉快的一天。
我找到了一些库,可以将托管代码导出为非托管代码,以便您可以在像C/C++这样的非托管语言中使用它。但是我没有找到任何解释如何完成此操作的内容(这是我更感兴趣的内容)。
我正在寻找信息、教程、文章、代码源或任何可以帮助我理解这个过程的东西。
另外,如果你在你的书签中发现了一些钩子/拦截资源,我也很想阅读它们 :)
提前感谢并祝您拥有愉快的一天。
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')" />
RGiesecke.DllExport.MSBuild.dll
中的类RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask
。该类使用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文件。