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


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

                              

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

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

                      

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

                   

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

            1.添加ClassLibrary1dll的引用:

                  

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

                  

            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的地方),运行。

                 大功告成!

     

        注意事项:

            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的示例源码:源码下载

  • 相关阅读:
    20165311《网络对抗技术》Exp1 PC平台逆向破解
    20165311 《网络对抗技术》 Kali安装
    2018-2019-1 20165307 20165327 20165332 实验五 通讯协议设计
    2018-2019-1 20165307 20165327 20165332 实验四 外设驱动程序设计
    2018-2019-1 20165307 20165327 20165332 实验三 并发程序
    2018-2019-1 20165307 20165327 20165332 实验二 固件程序设计
    2018-2019-1 20165307 20165327 20165332 实验一 开发环境的熟悉
    2018-2019-1 20165307 《信息安全系统设计基础》第4周学习总结
    2018-2019-1 20165307 《信息安全系统设计基础》第3周学习总结
    20165307 《信息安全系统设计基础》 第一周
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/3721949.html
Copyright © 2020-2023  润新知