Visual Studio 2010 EXE 打包 [重复]

Posted

技术标签:

【中文标题】Visual Studio 2010 EXE 打包 [重复]【英文标题】:Visual Studio 2010 EXE Packaging [duplicate] 【发布时间】:2012-12-23 01:30:59 【问题描述】:

可能重复:Embedding DLLs in a compiled executable

我有一个 c# winforms 应用程序以及一些依赖的 .dll 和一个依赖的外部 .exe。

是否有可能以某种方式将它们全部编译成一个可执行文件(不是安装程序),只是独立的可执行文件?

如果可能,从 VS 2010 Ultimate 开始?

【问题讨论】:

您应该真的在发布问题之前考虑searching。你不可能认为你是第一个需要这样做的人,是吗? 你做了哪些研究?分享您的研究对每个人都有帮助。告诉我们您发现了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复显而易见的答案,最重要的是它可以帮助您获得更具体和相关的答案:)祝你好运! 我遇到过 ILMerge,正如这里已经提到的:***.com/questions/189549/… 但我仍然不确定是否也可以向其中添加 EXE/XML 文件。 【参考方案1】:

简而言之:唯一可行的方法是将所有外部文件添加为嵌入式资源并使用ILMerge

选项 #1: 以下步骤展示了如何在 Visual Studio 中嵌入资源文件:

    转到解决方案资源管理器, 右键资源文件, 转到构建操作:选择嵌入式资源。

您将在 exe 中拥有该文件引用。稍后您可以在运行应用程序时使用反射并获取资源。借用here的源码:

带有托管 dll 的选项 #2

对于托管 DLL,您有几个选择:

使用ILMerge。 ILMerge 有一个不错的 GUI 界面,可以在 [这里]7] 找到 将它们作为资源嵌入,有关详细信息,请参阅this article。

查看以下CodeProject article that explains this。

ILMerge 是一个实用程序,可用于将多个 .NET 程序集合并为一个程序集。 ILMerge 采用一组输入程序集并将它们合并到一个目标程序集中。输入程序集列表中的第一个程序集是主程序集。当主程序集是可执行文件时,目标程序集将创建为与主程序集具有相同入口点的可执行文件。此外,如果主程序集具有强名称,并且提供了 .snk 文件,则使用指定的密钥对目标程序集重新签名,使其也具有强名称。

【讨论】:

很确定 OP 希望将代码 DLL(而不是纯粹包含资源的 DLL)包含到单个 EXE 中。您的答案更像是附属程序集。 这真的行不通。如果您的 EXE 引用了 DLL,它将首先无法加载,因此无法提取它们。 我添加了托管dll选项,没问题。 为什么你仍然强调只有当 dll 是托管 dll 时才可能 - 这两种方法都不适用于非托管 DLL! 因为在 ILMerge 中尝试加载一次非托管时会遇到问题。即使您能弄明白,如果 CLR 感知到托管代码部分是由非托管 dll 生成的,它也可能会拒绝运行它。【参考方案2】:

ILMerge 是一个实用程序,可用于将多个 .NET 程序集合并为一个程序集。

【讨论】:

只有当 dll 是托管 dll 时才有可能。 是的 - 这是给定的。我不太确定评论。您是说您的方法适用于非托管 DLL 吗? 因为在 ILMerge 中尝试加载一次非托管时会遇到问题。即使您能弄明白,如果 CLR 感知到托管代码部分是由非托管 dll 生成的,它也可能会拒绝运行它。 更重要的问题是如何处理 OP 中提到的外部依赖 .exe ......以及该程序集本身是否被管理。 :)

以上是关于Visual Studio 2010 EXE 打包 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

visual studio2013怎么样打包程序?用啥打包

怎样将vb的代码用visual studio 打包。生成exe文件?求具体打包过程,具体需要哪些文件一起打包,怎么打包

如何从 Visual Studio 2010 安装程序运行 schtasks.exe?

Visual Studio 2010 生成的.exe文件默认放在哪个文件夹?

visual studio 2010的应用程序在哪,那个文件里的哪个?

怎样用visual studio 2010生成所有电脑可执行的.exe文件?