C#将引用的dll嵌入到exe文件中

通过网上查询,将引用的dll,嵌入到exe项目中,通过编译为单一的exe文件。

1. 引用dll,将引用的dll设置为不复制(是否复制不影响使用,编译完成后,只需要exe就可以了, 旁边的dll是否存在并不影响使用)。

2. 将引用的dll嵌入到项目中。

新建一个项目文件夹,将引用的dll复制到此文件夹中,并包含中项目里,设置为“嵌入的资源;”

3. 在main()方法中,添加代码,处理找不到dll的相关异常处理。

static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new frmMain());

}

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs e)
{
    //项目的命名空间为myapp, 嵌入dll资源在libs文件夹下,所以这里用的命名空间为: myapp.libs.
    string _resName = "myapp.libs." + new AssemblyName(e.Name).Name + ".dll";
    using (var _stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(_resName))
    {
        byte[] _data = new byte[_stream.Length];
        _stream.Read(_data, 0, _data.Length);
        return Assembly.Load(_data);
    }
}

常规情况 下, 按以上3步操作,嵌入dll资源生成单一的exe文件就完成了。

今天写的新项目中,主窗体不是.net标准库的Form对象,遇到新的问题了,一开始执行程序就提示找不到dll的错误,通过设置断点发现,项目在开始执行main()时,还没进入main()中的代码,直接提示找不到dll。

经过查询资料、多次测试,猜测是在执行main()的时候,提前检测main()内的代码使用的引用资源,而不是执行到该行代码时才检查相关引用资源,于是在main中调用另一个func避开检测。

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    BeginRun();

}
static void BeginRun()
{

    var _form1 = new frmMain();
    Application.Run(_form1);

}

按此改动后,程序运行正常。


版权声明:本文为xiaoid原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。