2011-01-08 54 views
6

我有一個存儲兩個應用程序通用的類的DLL。我想保持我的應用程序限於一個EXE文件,並希望看到我是否可以以某種方式將此DLL嵌入到我的主EXE中。可能將一個DLL合併到一個.NET EXE中?

如何將外部DLL嵌入到我的應用程序中? (如果可能)

+1

由於DLL注入是一個過載的術語,因此更改了標題。 –

回答

9

ILMerge的替代方法是將相關程序集作爲嵌入式資源嵌入到可執行文件中,並利用assembly resolve機制將它們作爲資源流加載。如何做到這一點的一個例子可以在這裏找到:

http://blog.magenic.com/blogs/brante/archive/2008/04/14/Embedded-Assembly-Linker.aspx

我使用這個模式我這工作得很好。 ILMerge有時會遇到問題,因此您的milage可能會有所不同。

+0

爲什麼要使用ILMerge來做這件事? –

+1

@Pauli正如我所提到的,ILMerge在某些場景中有問題,例如它遇到了某種混淆(我們已經混淆了程序集),它在WPF Xaml資源方面遇到了問題,它在合併多個WPF程序集時遇到問題,因爲Xaml編譯器在同一名稱空間中的同名空間中的每個程序集中放置了助手類型ILMerge嘔吐重複類型。這些只是我個人所面對的。 –

+0

其真正的具有相同的全名(命名空間+類型名)的類型給了麻煩......我不知道它被允許加載幾個包含具有相同全名的類型的程序集到一個AppDomain中嗎?它是一個很好的技巧,允許將程序集存儲在數據庫中或通過互聯網下載。 –

1

Eazfuscator.NET是一個奇妙的工具,它也允許DLL合併和嵌入,以及它的正常混淆函數。它也對混淆代碼做了一些簡潔的優化。與其混淆ilmerge,您只需添加一個類標註,eazfuscator將爲您做所有事情。太棒了!

[assembly: System.Reflection.Obfuscation(Feature = "encrypt symbol names with password PAS$", Exclude = false)] 
[assembly: System.Reflection.Obfuscation(Feature = "embed nLog.dll", Exclude = false)] 
public class MyClass { 
    //blah 
} 
+1

Eazfuscator的輸出在哪裏呢? – Vikneshwar

+1

Eazfuscator與Visual Studio集成時,只是在編譯器的輸出上就地運行。所以無論在你的bin/Release文件夾中。如果你想做一些可定製的事情,你也可以用msbuild手動編寫腳本。 – scaryman

+0

@scaryman請您在使用'精彩'時能否透露聯盟的存在與否? (不要說這是什麼,但不是這樣 - 沒有這樣的聯繫會使我的估計增加*披露*) –

相關問題