C# 非托管 dll 导出(它是如何工作的)

标签 c# export hook unmanaged managed

我找到了可以将托管 代码导出为非托管 的库,因此您可以通过非托管 语言(如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.dllRGiesecke.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/

相关文章:

c# - 使线程等待两秒钟,然后再继续使用C#WPF

r - 将绘图导出到 Plot.ly 时出错

c++ - 使用二进制检测 Hook 函数

c# - 有没有办法避免方法重复调用?

c# - 在 jQuery Post 中获取 SessionId

c# - 如何将列表转换为数组?

Firebase 无法导出为 JSON

ios - 如何使用 React Native 接收在 iOS 上导出/共享的文件

从接收后 Hook 更新 Git 子模块

save - 如何跳过 Mongoose 预保存钩子(Hook)?