分享

Winform集成零散dll进exe的方法

 NaturalWill 2014-06-20

前阵子我正在一个小c# WinForms应用程序在Visual Studio 2008中。为了简化应用程序的部署过程,在它的所有组件捆绑成一个exe文件将使它更容易管理。But-documentation和教程上嵌入dll文件在一个exe文件是过时的,不完整的,或者只是没有工??。

最好的例子很多 摘自一本书,贴在MSDN的博客作者。不幸的是,它不工作,不包括明确的指示或如何实现它。然而,它仍然提供了一个很好的起点。经过一些研究,反复试验,Visual Studio调试器的帮助下,这是解决方案。

注意:这个方法允许您将dll文件到任何子文件夹或一系列的子文件夹在您的项目中,而不需要改变任何代码后的事实。如果你想放弃使用一个子文件夹(将dll文件在项目的根),或者使用硬编码的子文件夹路径包含dll文件(s)相反,有替代方法可能更合适,但是不会被覆盖。

1)dll文件本身需要嵌入在Visual Studio项目中,而不是引用。在你的项目中,在项目中创建一个文件夹存储dll文件的根(右键单击项目名称> >添加新文件夹)。我叫“自由”。

2)复制和粘贴你的dll(和任何附带的支持或定义文件)到lib文件夹。本教程的目的,使用的示例dll 桂皮.

3)接下来,包括项目资源dll。右键单击项目名称>属性(或项目菜单> yourprojectname 属性)。去“资源”选项卡。

选择“文件”,如下所示:

点击“添加资源”,文件类型更改为“所有文件”,并导航到“自由”文件你的dll的位置。选择它,然后单击“打开”。

dll文件现在应该包括项目资源:

4)添加一个引用dll文件的项目。在解决方案资源管理器窗格中,右键单击“引用”>添加引用(或项目菜单>添加引用)。单击Browse选项卡上,导航到lib文件夹dll所在地,选择dll文件,并单击“Ok”。引用你的dll将出现在引用文件夹在您的项目。

5)在默认情况下,编制项目文件和引用复制到本项目时建立的文件夹。这将需要预防的。在“引用”文件夹,选择您的dll文件的引用。在properties窗格(或右击>属性),寻找属性命名为“复制到输出目录”,并将值设置为false。

接下来,选择“自由”文件夹下的dll文件。在properties面板中,寻找属性复制到输出目录,将值设置为“不要复制”。

也寻找属性“建设行动”,将值设置为“嵌入的资源”。这表明如何处理文件和访问项目时。

最后,排除无关的文件所附的dll文件,例如帮助文件和XML定义files-they不需要在项目构建时。右键单击该文件(比如XML定义文件),然后单击“从项目排除”。现在,它将不会复制到本项目时建立的文件夹。

6)在WinForm上执行的代码视图,包括namespaceSystem.Reflections。 这是很重要的一些代码负责加载嵌入式dll文件(年代)。

7)在代码视图为您执行WinForm上,这段代码应该放在构造函数方法(通常叫一样的形式)。它需要朝见theInitializeComponent() 方法:

1
2
3
4
5
6
7
8
9
10
11
12
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string resourceName = new AssemblyName(args.Name).Name + ".dll";
string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};

在启动exe,这段代码负责检测需要什么样的dll文件和被引用,和负载他们从嵌入的位置。

8)在代码中执行WinForms应用程序视图,您现在可以包括dll文件的命名空间(s)。

9)一切为了测试,您将需要实现代码从dll文件的名称空间(s),以便AssemblyResolve事件触发。但是,如果包括代码从dll的名称空间(s)在构造函数中,Application.Run() 将抛出一个“文件未找到”对你的dll文件错误当WinForms应用程序构建和执行。

纠正这一点,您需要将任何代码使用dll文件名称空间(s)在构造函数方法之外的另一种方法。这是因为事件处理程序的汇编程序不能位于相同的方法调用。这很简单,但这只是一个警告是意识到。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多