[英]C# unmanaged dll exporting (how it works)
我發現,將托管代碼導出為不受管理的 ,所以你可以像C / C ++語言的非托管使用庫。 但我沒有找到任何可以解釋它是如何完成的(這是我更感興趣的)
我正在尋找信息,教程,文章,代碼源或任何可以幫助我理解其工作原理的東西
另外,如果您在書簽中找到了一些鈎子/繞道資源,我也很樂意閱讀它們:)
在此先感謝您,祝您度過愉快的一天。
我會發一個答案,收集我寫的評論。
最着名的圖書館是(如今) 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)安裝在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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.