我找到了可以将托管 代码导出为非托管 的库,因此您可以通过非托管 语言(如C/C++)使用它。但是我没有找到任何可以解释它是如何完成的(这是我更感兴趣的)
我正在寻找信息、教程、文章、代码源或任何可以帮助我理解其工作原理的东西
附带说明一下,如果您在书签中发现了一些 hooks/detours 资源,我也很乐意阅读它们:)
提前致谢,祝您有美好的一天。
最佳答案
我会发布一个答案,收集我写的评论。
最著名的图书馆是(今天)UnmanagedExports .它的页面是https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports .遗憾的是,没有可用的源代码,但它是在 MIT 许可下获得许可的,因此使用 IlSpy 看看它可能是可以的。
有一些关于它是如何完成的引用资料。
Codeproject 上至少有两篇文章:How to Automate Exporting .NET Function to Unmanaged Programs这似乎适用于 .NET 2.0 和 Unmanaged code can wrap managed methods遗憾的是,这是关于 .NET 1.1 的。
书中有一些引用Expert .NET 2.0 IL Assembler大约第 384 页。
你当然可以做另一件事:观察什么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/