C#unmanaged dll导出(如何工作)

use*_*832 8 c# hook export unmanaged managed

我发现,将出口库管理代码,非托管,所以你可以使用它的非托管像C/C++语言.但我没有找到任何可以解释它是如何完成的(这是我更感兴趣的)

我正在寻找信息,教程,文章,代码源或任何可以帮助我理解其工作原理的东西

另外,如果您在书签中找到了一些钩子/绕道资源,我也很乐意阅读它们:)

在此先感谢您,祝您度过愉快的一天.

xan*_*tos 8

我会发一个答案,收集我写的评论.

最着名的图书馆是(如今)UnmanagedExports.其页面为https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports.遗憾的是,没有可用的源代码,但它是根据MIT许可证授权的,因此可以使用IlSpy来查看它.

关于它是如何完成的,有一些参考文献.

Codeproject上至少有两篇文章:如何自动将.NET函数导出到非托管程序,似乎是针对.NET 2.0和非托管代码可以包装托管方法,遗憾的是.NET 1.1.

第384页的Expert .NET 2.0 IL Assembler一书中有一些参考.

你可以肯定做另一件事:观察做UnmanagedExports什么:UnmanagedExports最后由两部分"组成":一个RGiesecke.DllExport.Metadata.dll包含"愚蠢"属性DllExportAttribute和两个程序集的程序集(在我的计算机上,nuget安装在程序包中\ UnmanagedExports.1.2.6\tools文件夹):RGiesecke.DllExport.dllRGiesecke.DllExport.MSBuild.dll.nuget安装程序为csproj UnmanagedExports添加了一些行,如:

<Import Project="packages/UnmanagedExports.1.2.6/tools/RGiesecke.DllExport.targets" Condition="Exists('packages/UnmanagedExports.1.2.6/tools/RGiesecke.DllExport.targets')" />
Run Code Online (Sandbox Code Playgroud)

导致程序RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask集中包含的类的执行RGiesecke.DllExport.MSBuild.dll.这个类使用Mono.Cecil,重写组件进行一些代码重新编织.该程序只是调用ildasm生成il代码源,修改il代码源,然后用于ilasm生成"原始".dll/.exe.所以简单地说,生成两个程序集,一个用<Import />另一个用<Import />注释掉,然后做一个

ildasm yourdll.dll /out=source.il
Run Code Online (Sandbox Code Playgroud)

两个文件并将其与您最喜欢的文件比较器进行比较.

另一个有趣的链接在这里.有一些评论如何使它在x64上工作.

如果我必须构建类似的东西,我可能会尝试将它集成到Fody.通过这种方式,我可以免费获得整个后期构建任务(因为它是由Fody完成的)

无法完成Mono.Cecil... Mono.Cecil无法编写混合模式程序集(导出符号所需).你必须使用UnmanagedExports(以及其他各种例子)使用的相同"技巧"...生成IL文件,修改它(它是一个固定格式的文本文件......很容易修改),重新 - 生成.dll/.exe.

  • 现在有一个后续/分支,它是开源的:https://github.com/3F/DllExport/ (3认同)

den*_*ufa 6

以下是github上维护的非托管导出的源代码:

https://github.com/3F/DllExport

非托管导出必须基本上是c ++/cli编译器必须为反向pinvoke做的事情.