在用Winform做界面时,经常会引用到各种dll库,编译生成后是和exe同目录存在,遇到很多dll的时候就看着很别扭,如果能把dll全部塞到exe里面,就干净多了,包括各种资源文件也是。
1、首先把需要用到的资源和dll,全部放到项目的Resources目录中,然后在Resources.resx中添加资源
这里有2个图片,1个压缩包,2个dll文件。在resx文件中,首先选择文件类型,这里就是图片和文件两种,分别添加现有文件:
2、添加如下代码,可以将资源从resx中变成字节数据然后加载到程序集合中:
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; ResourceManager rm = new ResourceManager(GetType().Namespace + ".Properties.Resources", Assembly.GetExecutingAssembly()); byte[] bytes = (byte[])rm.GetObject(dllName); return Assembly.Load(bytes); }
接着在构造函数的InitializeComponent()之前需要调用CurrentDomain_AssemblyResolve方法:
public MainForm() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); InitializeComponent(); }
AssemblyResolve可以动态的加载资源文件到程序集中,代码中就能直接引用了。