如何将松散的dll打包进需要发布的exe

摘要:
我们需要发布的exe文件可能多次依赖于一堆松散的dll。如果您希望在发布时只提供exe文件,而不是将大量dll放在与exe相同的文件夹中,那么有一种方法。该方法由CLRvia C#的作者提出。我在实践过程中遇到了几个问题。现在,我想记录整个过程和注意事项。然后添加AppDomain。当前域。AssemblyResolve+==˃在此方法的开头….以下是Winform和WPF的示例源代码:源代码下载

  我们需要发布的exe文件很多时候都可能会依赖于一堆松散的dll,如果想在发布的时候只提供exe文件,而不想把一大堆dll一起放在和exe同一个文件夹下,是有方法的,该方法由CLR via C#作者提出,我在实践的过程中遇到的几点问题,现在记录下总体的流程和该注意的事项。

                          

    一.新建需要使用的类库:

        1.打开VS,新建类库,使用默认的ClassLibrary1名称。

                  如何将松散的dll打包进需要发布的exe第1张

        2.在Class1中添加一个公开的方法:HelloWrold,并且返回一个字符串。

               如何将松散的dll打包进需要发布的exe第2张

    二.以Winform为例来写个exe程序。

        1.添加ClassLibrary1dll的引用:

              如何将松散的dll打包进需要发布的exe第3张

        2.把ClassLibrary1复制到项目中,右键dll,选择生成方式为:嵌入的资源

              如何将松散的dll打包进需要发布的exe第4张

        3.打开Form1的后台代码,修改成:

复制代码
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
            MessageBox.Show(c1.HelloWrold());
        }
    }
复制代码

       4.使用作者提供的代码,原理就是:绑定在应用程序发生程序集解析失败的时候触发的事件,在绑定方法中获取自身exe的资源,并且加载。打开Program类,修改成:

        

复制代码
static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {
                String resourceName = "WindowsFormsApplication1." +


                new AssemblyName(args.Name).Name + ".dll";


                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                {
                    Byte[] assemblyData = new Byte[stream.Length];


                    stream.Read(assemblyData, 0, assemblyData.Length);


                    return Assembly.Load(assemblyData);


                }
            };
            Application.Run(new Form1());
        }
    }
复制代码

    这里要注意的是(WindowsFormsApplication1.)这个是需要改动的点,就是dll在exe资源中的前缀名称,大家可以使用反编译工具查看exe资源,然后再修改。

 

      5.测试

        找到bin目录下,把exe文件拷贝到桌面或者其他地方(没有依赖的dll,这里是没有ClassLibrary1.dll的地方),运行。

            如何将松散的dll打包进需要发布的exe第9张 大功告成!

 

    注意事项:

        1.AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>。。。。  这个核心方法必须要放到Form启动之前,因为一旦启动以后,就不会执行这个了,进程被阻
塞。  
        2.在WPF中没有Programe类,大家可以重写App.xaml.cs中的App类的OnStartup方法:protected override void OnStartup(StartupEventArgs e)。然后在这个方法最前面添加AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>。。。。 这个核心方法。

           

                下面提供的是Winform和WPF的示例源码:源码下载

免责声明:文章转载自《如何将松散的dll打包进需要发布的exe》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇eclipse部署项目到tomcatfastboot 烧写内核下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转载别人的DLL DEll研究

昨日,编了个DLL和EXE来进行了下测试,exe通过lib静态联编dll,来调用它的导出类,当改变DLL中导出类的结构(eg.成员变量的顺序等),从新发布DLL而不从新联结编译EXE,就会造成错误的执行结果或崩溃!通过观察DLL和EXE生成的汇编代码,才知道生成的机器码中并无类的成员变量,只有类的Size(根据成员变量和有无虚函数)和类函数代码。    函...

断点不能加载

C#调用C++/CLI 的代码中,C++的代码总不能跟踪。其中我的C#是新代码,而C++则是同事发给我的现在程序中已经使用的代码。我现在要做到就是把C++的大部分东西推到重来。由于进度紧张,连C++的项目文件都没有没有改,这导致浪费了一整天的时间。 在debug的状态下,查看Modules的信息,发现那个C++总是调用别人的dll,而symbol file...

C#中将DLL文件打包到EXE文件

1:在工程目录增加dll目录,然后将dll文件复制到此目录,例如: 2:增加引用,定位到工程的dll目录,选中要增加的dll文件 3:修改dll文件夹下面的dll文件属性 选中嵌入式资源,不复制。 4:增加dll加载代码 static classProgram { /// <summary>...

C#如何调用C++的dll

 背景 一个项目,算法部分使用C++的openCV库编写图像处理程序,编译成dll,用户界面采用C#编写,去调用该dll暴露的接口。  C#编写的是托管代码,编译生成微软中间语言,而普通C++代码则编译生成本地机器码,这两种语言不能直接混合编程。常见的方式是: 1)将本机C++代码(指非托管C++)编译成一个dll,供C#调用,调用方法为 [DllImpo...

Qt 将界面程序封装成动态库DLL

1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了): 然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SHAREDLIB_H #include <QtCore/qglobal.h> #if defined(SHAREDLIB_LIBRARY...

C#--反射基础

以下是学习笔记: 一,反射的基本信息 DLL/EXE: 主要区别EXE文件有一个入口,DLL文件不能运行,但是DLL能拿到其他地方去使用 metadata(元数据):描述exe/dll文件的一个清单,记录了exe/dll文件中有哪些类,属性,特性,字段。。。 Reflection(反射):用来操作或获取元数据metadata 有什么作用: 1,更新程序(...