如何将整个.NET Framework应用程序构建为单个.exe文件?

37

我开发了一些没有数据库的软件。我想创建一个独立的 .exe 文件,以便将仅 .exe 文件提供给用户使用该软件。

不幸的是,我不知道如何在 .Net 中创建我的项目的独立 .exe 文件。

有人能为这个问题提供指导吗?


9个回答

28

可能类似于ILMerge之类的东西吗?

甚至还有一个GUI

注意:我实际上没有尝试过它们中的任何一个。


9

有一个叫Costura.Fody的附加程序,它将所有内容编译到一个单独的exe文件中,不需要安装。可以通过nuget进行安装,但最新版本的nuget将防止创建FodyWeavers.xml文件,因此需要手动完成。


此帖最新版本:Fody:在项目级别(Z:\ xCode \ c.sharp \ [ProjectFolder])找不到FodyWeavers.xml文件。已创建默认文件。请查看该文件并将其添加到您的项目中。 - platinums

2

我尝试过:

  • ILMerge
  • Costura.Fody
  • 将文件添加到资源并编译生成新的exe文件,该文件将启动带有DLL的原始exe。

它们都可以工作,但是当我尝试将它们复制到另一台电脑上时(2021年6月17日),它们都被Windows Defender标记为恶意软件。Virustotal上的快速扫描确认了其他杀毒软件也存在这个问题。似乎改变DLL加载方式会触发杀毒软件的启发式分析。

然后我尝试使用自解压存档,在启动时简单地解压程序并从临时目录启动程序中的DLL。我尝试了7z和Winrar,并使用了各种不同的设置。我找到的唯一可靠的组合是:

  • 使用WinRAR v6.02(撰写本文时的当前版本,其他版本也可能有效)
  • 保留提取对话框(隐藏它们会增加误报率)
  • 使用64位zip压缩(使用32位zip或rar也会增加误报率)

这给了我一个可以双击以启动程序的exe文件,但需要注意的是它将无法在32位上运行,并且在启动时将显示提取对话框。

这样可以在virustotal.com上实现0/66的检测率:https://www.virustotal.com/gui/file-analysis/MDMxZmI3OWZiYTU3MTU1YWIxYmFmYTM0MjM4ZmE1MmE6MTYyMzkzMjY4OA==/detection

显然,这可能会随着时间的推移而改变,因此更可靠的方法可能是将您的exe与DLL作为压缩文件夹一起分发或使用安装程序。

enter image description here enter image description here enter image description here enter image description here enter image description here


我的客户刚刚打电话告诉我,他无法执行该文件,因为他的计算机是32位的。我们应该吸取教训,只使用简单直接的压缩文件或安装程序。其他方法都不可靠。这真的很糟糕,我认为Windows应该提供一种简单的方式来分发应用程序并支持一键运行。 - Gellweiler

2

终于找到了完美的答案

由于该页面已经过时,我担心它会被删除,因此将整个页面发布而没有图片。

对我来说,我没有费心制作“不要复制”的参考资料。此外,我完全跳过了第4步,因为我无法添加它们。我想知道是否与Nuget Manager已经添加有关。

最终,我可以轻松地从我的硬盘驱动器中提取出exe文件并在任何地方运行它。

以上内容源自上述链接。

前段时间我在Visual Studio 2008中开发了一个小型C# WinForms应用程序。为简化应用程序的部署流程,将所有组件打包成一个exe文件会更容易管理。但是 - 关于在exe文件中嵌入dll文件的文档和教程已经过时、不完整或根本无法工作。
其中最好的例子来自一位作者在MSDN博客上发布的一本书的摘录。不幸的是,它按照所呈现的方式并没有起作用,并且没有清晰的指令告诉你如何在哪里实现它。然而,它仍然提供了一个很好的起点。经过一些研究、试验和错误,以及Visual Studio调试器的帮助,这里是解决方案。
注意:此方法允许您将dll文件放入项目中的任何子文件夹或一系列子文件夹中,而无需在事后更改任何代码。如果您希望放弃使用子文件夹(将dll文件放置在项目根目录中)或者使用硬编码路径到包含dll文件的子文件夹(s),则有适合的替代方法,但此处不会涉及。
1. dll文件本身需要嵌入到Visual Studio项目中,而不仅仅是参考。在项目中,创建一个文件夹以存储dll文件(右键单击项目名称 > 添加 > 新建文件夹)。我将其命名为“lib”。
2. 将你的dll(和任何附带的支持或定义文件)复制并粘贴到lib文件夹中。在本教程中,使用的示例dll将是Cassia。
3. 接下来,将dll作为一个项目资源包括在其中。右键单击项目名称 > 属性(或者Project菜单 > yourprojectname Properties)。转到“资源”选项卡。
4. 选中“文件”,如下图所示:
5. 点击“添加资源”,将文件类型更改为“所有文件”,然后导航到存储dll文件的“lib”文件中。选择它,然后点击“打开”。
6. dll文件现在应该作为一个项目资源被包括在内:
7. 在项目中添加对dll文件的引用。在“解决方案资源管理器”窗格中,右键单击“引用” > 添加引用(或者Project菜单 > 添加引用)。点击浏览选项卡,在dll所在的lib文件夹中导航,选择dll文件,然后点击“确定”。然后,dll的引用将出现在项目的引用文件夹下。
8. 默认情况下,在构建项目时,编译的文件和项目引用都会被复制到bin文件夹中。这需要防止发生。在“引用”文件夹下,选择指向dll文件的引用。在属性面板(或右键单击 > 属性)中,查找名为“复制到输出目录”的属性,并将其值设置为false。
9. 接下来,在“lib”文件夹下选择dll文件。在属性面板中,查找属性“复制到输出目录”,并将其值设置为“不复制”。
10. 还要查找属性“生成操作”,并将其值设置为“嵌入式资源”。这表示项目构建时如何对待和访问该文件。
11. 最后,排除伴随dll文件的多余文件,例如帮助文件和XML定义文件 - 它们在构建项目时不需要。右键单击文件(例如XML定义文件),然后点击“从项目中排除”。现在,在构建项目时不会将它复制到bin文件夹中。
12. 在你的执行WinForm中的code视图中,包括System.Reflections命名空间。这对于

-3
在Visual Studio中构建项目时,会自动创建一个.exe文件。该文件可以在项目的/bin/debug或/bin/Release文件夹中找到。但是,如果该文件夹包含除你的.exe文件以外的其他文件,则应向最终用户提供整个Debug或Release文件夹。
附注:建议仅提供“release”版本的.exe文件,而不是“debug”版本。

2
是的,但我不想提供任何文件。带有.EXE扩展名的文件。我只想向最终用户提供.EXE文件..这是我的实际目的。 - 2easylogic

-3

其他人已经解决了.exe的问题,所以从一个普遍的开发角度来看,你可能想要审查你的代码并识别出可以在未来开发中重复使用的函数/类。

然后,你可以将它们提取到一个单独的.DLL文件中,仍然为你的用户提供软件,但下一个应用程序的开发会更容易一些,并且对这些函数的任何改进都可以轻松地在两个应用程序中采用...


-3
创建安装程序(在 MSDN 中查找),将项目输出文件打包到安装程序中。Visual Studio 将创建一个安装程序和引导式 exe 文件,您可以使用 exe 或 msi 文件来运行应用程序。

2
是的,它可以是 .msi 或 .exe 格式的文件。但是,我不想安装 .exe 文件,只需点击 .exe 文件即可运行。 - 2easylogic
就像帖子中其他人提到的那样,您可以在bin/release或debug中找到exe文件,但您必须将整个文件夹交给客户端。更简单的方法是使用安装程序项目exe,将其配置为什么都不做,只需执行即可。此外,您还可以尝试创建一个批处理文件可执行文件来运行位于bin/debug或release中的.exe文件。 - Sam
1
是的,但如何创建一个 .exe 文件而不将所有文件提供给客户端是我的实际问题? - 2easylogic
而且.NET框架已经在最终用户端安装好了,所以不用担心。 - 2easylogic

-3
当您在Visual Studio中运行项目时,应用程序的exe文件将在调试文件夹中创建,您可以将该exe文件提供给朋友以测试您的应用程序。否则,在Visual Studio中创建一个安装程序项目。MSDN上提供了有关安装程序项目的帮助。安装程序项目将创建您的应用程序的安装程序,就像市场上其他软件一样,您可以将该安装程序提供给朋友使用。

-3

当编译 .Net 项目时,会在应用程序属性中设置的 Debug/release 路径上生成 exe 文件。 我想你正在要求提供自解压应用程序安装 exe 文件,以便用户可以使用软件而不提供任何相关源代码或项目文件。 为了尝试打包,您可以尝试免费提供的应用程序打包工具,例如 innosetup 或 Nsis,并将其打包成安装文件。我使用 Innosetup,它很容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接