通过网上查询,将引用的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 版权协议,转载请附上原文出处链接和本声明。