簡體   English   中英

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

[英]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.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.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。

以下是github上維護的非托管導出的源代碼:

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

非托管導出必須基本上是c ++ / cli編譯器必須為反向pinvoke做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM