博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何将松散的dll打包进需要发布的exe
阅读量:7062 次
发布时间:2019-06-28

本文共 2204 字,大约阅读时间需要 7 分钟。

  我们需要发布的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    {        ///         /// 应用程序的主入口点。        ///         [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的示例源码:

转载地址:http://kynll.baihongyu.com/

你可能感兴趣的文章
开源倾情奉献:基于.NET打造IP智能网络视频监控系统(三)命令行工具集
查看>>
[Step By Step]在SAP Business Objects Data Services中使用SQL Transform将数据导入到SAP HANA中(SQL Transform)...
查看>>
有关T-SQL的10个好习惯
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版
查看>>
第 19 章 Class
查看>>
利用WCF的P2P共享剪贴板上的数据
查看>>
二分查找模版
查看>>
快速傅里叶变换(FFT)算法【详解】
查看>>
解决Windows10下80端口被PID为4的System占用的问题
查看>>
多个Tomcat同时运行环境配置 - imsoft.cnblogs
查看>>
opengl 教程(24) shadow mapping (2)
查看>>
RxJava 2.x 使用最佳实践
查看>>
java中关于继承的问题
查看>>
认证服务号可通过模板消息向用户发送重要的服务通知
查看>>
OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)
查看>>
Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
查看>>
iOS - UIActionSheet
查看>>
用户 'IIS APPPOOL\xxxx' 登录失败
查看>>
iOS - TouchID 指纹识别
查看>>
centos7上安装redis
查看>>