程序开发完成后,发现dll很多。发布后用户不小心删除一个程序挂了,运行不了,太麻烦。那就把dll集成到exe中。
方式一(不推荐):
1:把需要应用的dll添加到程序中(包含在项目中)
2:程序添加该dll的引用,引用的位置要和程序包含位置一致
3:集成到一个当前程序的exe中,则dll的属性设置(false 复制本地)
4:添加事件检测dll程序集事件方法
程序启动前添加检测方法:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
}
}
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
//获取当前代码程序集
Assembly executingAssembly = Assembly.GetExecutingAssembly();
var executingAssemblyName = executingAssembly.GetName();
var resName = executingAssemblyName.Name + “.resources”;
AssemblyName assemblyName = new AssemblyName(args.Name);
string path = "";
if (resName == assemblyName.Name)
{
path = executingAssemblyName.Name + ".g.resources"; ;
}
else if (assemblyName.Name == "Newtonsoft.Json")
{
//path = "DataConversion.Dll." + assemblyName.Name + ".dll";
path = "DataConversion.Resources." + assemblyName.Name + ".dll";
}
else
{
path = assemblyName.Name + ".dll";
if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
{
path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
}
}
using (Stream stream = executingAssembly.GetManifestResourceStream(path))
{
if (stream == null)
return null;
byte[] assemblyRawBytes = new byte[stream.Length];
stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
return Assembly.Load(assemblyRawBytes);
}
}
方式二(推荐):
1:添加资源到到Resources中
Resources文件夹下自动生成dll文件
2:程序启动前添加事件
程序集解析失败事件
///
/// App.xaml 的交互逻辑
///
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
private 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”, Assembly.GetExecutingAssembly());
byte[] bytes = (byte[])rm.GetObject(dllName);
return Assembly.Load(bytes);
}
}