sgxw

我们在在winform程序时经常会用到外部dll,正常情况下,我的exe运行文件旁就需要这些dll文件相伴,总感觉不爽~~特别是要把软件给别人的时候,如果DLL比较多或者没有放在同一个地方,那麻烦大了~~~

所以,如果能把引用的DLL都嵌入到exe内,最终就剩下一个exe文件就完事的话,那这时间该多美好呀(处女座病~~)我相信这是很多人的梦想~~

于是,一场追逐梦想的征途开始了~~~

——————————————

百度……

利用ILMerge打包。

具体操作:网上下载程序,安装,用cmd命令运行,输入复杂的指令进行打包~~结果,我的居然失败??确实,网上也有人说这个成功率不高~~

参考http://blog.csdn.net/astonqa/article/details/7300856的第二个方法,鄙人整了好久,resourceName那里不会填,然后~也没有然后了……

关于将dll选择为“嵌入的资源”的方法,好像不能用于一般的DLL,参考http://msdn.microsoft.com/en-ca/library/538aes2a(zh-cn).aspx 和http://msdn.microsoft.com/zh-cn/library/hfac4fky(VS.80).aspx

几经周折,找到了http://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!

分类:

C#

技术点:

相关文章: