C#winform将dll文件嵌入exe的方法和注意事项

C#winform将dll文件嵌入exe的方法和注意事项_第1张图片

一、右击项目,选择“属性”,或者,点击菜单“项目”,选择属性。
C#winform将dll文件嵌入exe的方法和注意事项_第2张图片
C#winform将dll文件嵌入exe的方法和注意事项_第3张图片
二、选择“资源”,在类型中,下拉选择“文件”,点击“添加资源”,选择你要嵌入到exe的dll文件,然后“打开”
注意:寻找文件时,文件类型选择为“所有文件(“.”)”,
C#winform将dll文件嵌入exe的方法和注意事项_第4张图片
C#winform将dll文件嵌入exe的方法和注意事项_第5张图片
在这里插入图片描述
三、添加资源后,如果项目下没有“”文件夹,VS会自动创建,如果已有,则会把你选择打开的文件复制到该文件夹下,无需修改文件属性,因为默认就是“不复制”,生成的操作是“无”,若不是,则手动修改,即可。
C#winform将dll文件嵌入exe的方法和注意事项_第6张图片
在这里插入图片描述
C#winform将dll文件嵌入exe的方法和注意事项_第7张图片
四、如果需要引用dll,则选择项目下Resources文件夹里的dll,并且,引用后,将dll的“复制本地”改为“False”(默认为True)
C#winform将dll文件嵌入exe的方法和注意事项_第8张图片
C#winform将dll文件嵌入exe的方法和注意事项_第9张图片

五、在主窗体中,添加“CurrentDomain_AssemblyResolve”方法。

/// 
/// 用来调用嵌入到exe的DLL资源
/// 
private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, System.ResolveEventArgs args)
{
    System.Console.WriteLine(args.Name);
    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", System.Reflection.Assembly.GetExecutingAssembly());
    byte[] bytes = (byte[])rm.GetObject(dllName);
    return System.Reflection.Assembly.Load(bytes);
}

六、在主窗体的构造方法中,进行调用。

/// 
/// 窗体构造
/// 
public VirtualMeterForm()
{
    System.AppDomain.CurrentDomain.AssemblyResolve += new System.ResolveEventHandler(CurrentDomain_AssemblyResolve);
    InitializeComponent();
}

七、主窗体的命名空间,应该与Program.cs的命名空间一致,最好是一级命名空间
C#winform将dll文件嵌入exe的方法和注意事项_第10张图片
C#winform将dll文件嵌入exe的方法和注意事项_第11张图片
八、Program.cs中不能直接使用嵌入的dll中的方法、函数、类型等,要在主窗体实例化后,用主窗体的方法来使用嵌入的dll中的方法。下面图中show1方法中的UI.SelfForm类就是嵌入的dll中的。
C#winform将dll文件嵌入exe的方法和注意事项_第12张图片
在这里插入图片描述
九、主窗体的属性中,不能使用嵌入的dll中的类型作为属性,也就是说,在主窗体的构造方法执行之前不能使用嵌入的dll的类型属性,但可以把需要作为属性的类型放入一个其他类,在主窗体,将该类作为属性,但此类不能直接实例化。
C#winform将dll文件嵌入exe的方法和注意事项_第13张图片C#winform将dll文件嵌入exe的方法和注意事项_第14张图片
十、通过上述的方式操作,生成的exe便会嵌入你想要嵌入的dll,并顺利运行。建议生产前,先进行一次清理。

你可能感兴趣的:(C#,c#,visual,studio)