zoukankan      html  css  js  c++  java
  • dll打包进需要发布的exe z

    http://www.cnblogs.com/Jarvin/p/3721195.html

    我们需要发布的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的示例源码:源码下载

  • 相关阅读:
    68
    56
    Django manager 命令笔记
    Django 执行 manage 命令方式
    Django 连接 Mysql (8.0.16) 失败
    Python django 安装 mysqlclient 失败
    H.264 SODB RBSP EBSP的区别
    FFmpeg—— Bitstream Filters 作用
    MySQL 远程连接问题 (Windows Server)
    MySQL 笔记
  • 原文地址:https://www.cnblogs.com/zeroone/p/3750750.html
Copyright © 2011-2022 走看看