C# Dll集成到exe

本文介绍了两种方法将DLL文件集成到EXE程序中,以避免用户误删导致程序无法运行的问题。方法一不推荐,涉及将DLL添加到项目、设置属性和添加AssemblyResolve事件处理。方法二推荐使用,通过将DLL作为资源添加到项目,并在程序启动时处理AssemblyResolve事件来加载资源中的DLL。
摘要由CSDN通过智能技术生成

程序开发完成后,发现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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值