Winform中打包资源和dll文件

By | 2017年3月16日

在用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可以动态的加载资源文件到程序集中,代码中就能直接引用了。