dllexe打包工具_如何将松散的dll打包进需要发布的exe-阿里云开发者社区

原文:如何将松散的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 classForm1 : Form

{publicForm1()

{

InitializeComponent();

ClassLibrary1.Class1 c1= newClassLibrary1.Class1();

MessageBox.Show(c1.HelloWrold());

}

}

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

static classProgram

{///

///应用程序的主入口点。///

[STAThread]static voidMain()

{

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= newByte[stream.Length];

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

}

};

Application.Run(newForm1());

}

}

这里要注意的是(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的示例源码:源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值