C#winform將dll封裝到exe當中
我們在在winform程式時經常會用到外部dll,正常情況下,我的exe運行文件旁就需要這些dll文件相伴,總感覺不爽~~特別是要把軟體給別人的時候,如果DLL比較多或者沒有放在同一個地方,那麻煩大了~~~
所以,如果能把引用的DLL都嵌入到exe內,最終就剩下一個exe文件就完事的話,那這時間該多美好呀(處女座病~~)我相信這是很多人的夢想~~
於是,一場追逐夢想的征途開始了~~~
——————————————
百度……
利用ILMerge打包。
具體操作:網上下載程式,安裝,用cmd命令運行,輸入複雜的指令進行打包~~結果,我的居然失敗??確實,網上也有人說這個成功率不高~~
參考//blog.csdn.net/astonqa/article/details/7300856的第二個方法,鄙人整了好久,resourceName那裡不會填,然後~也沒有然後了……
關於將dll選擇為「嵌入的資源」的方法,好像不能用於一般的DLL,參考//msdn.microsoft.com/en-ca/library/538aes2a(zh-cn).aspx 和//msdn.microsoft.com/zh-cn/library/hfac4fky(VS.80).aspx
幾經周折,找到了//www.crifan.com/csharp_integrate_dll_library_into_exe_application/comment-page-1/,但是,此文不是一般的長,我是從中間靠下面的【整理】開始看起的……
然後開搞~最後終於成功了!不過發現有需要修改和優化的:
(我的是win7 32bit VS2010 framework 4.0)
第一:無需新增文件夾以及在此文件夾里增加DLL,因為我的VS裡頭Resources下面已經有了。
第二:不用把DLL的「生成操作」弄成「嵌入的資源」,節省exe空間
第三:看下面完整操作吧~~
雙擊Resources.resx
選擇添加現有文件,把所需DLL添加進來
這樣工程下面會自動生成:
然後,不需要給DLL設置為「嵌入的資源」(反正我是不需要的)
最後,看程式碼:(Form1.cs)
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", ""); dllName = dllName.Replace(".", "_"); if (dllName.EndsWith("_resources")) return null; System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly()); byte[] bytes = (byte[])rm.GetObject(dllName); return System.Reflection.Assembly.Load(bytes); } public Form1() { //在InitializeComponent()之前調用 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); InitializeComponent(); }
到此就大功告成啦,當然前提你要把該引用的都引用了,好像有的人說引用的時候需要選擇Resources文件夾裡頭的DLL(就是前面的添加完DLL後會在工程目錄下生成Resources文件夾,文件夾裡頭會放著添加了的DLL),反正我試了不選那裡頭也行。
把exe複製到其它路徑進行測試吧~~GoodLuck!
原文鏈接://blog.csdn.net/lin381825673/article/details/39122257