在Visual Studio中编译成独立的可执行文件(.exe)

43

如何在Visual Studio中制作独立的exe文件。它只是一个简单的控制台应用程序,我认为用户不想安装一个微小的控制台应用程序。我使用Visual Studio命令提示符编译了一个简单的cpp文件。如果未安装.NET框架,exe文件是否可用?我使用本机C++代码。


你是在询问如何创建一个无需安装 .NET 运行时即可使用的 .exe 文件吗? - D'Arcy Rittich
2
C++能在asveikau上运行吗?有相关文章吗? - Mohit Deshpande
在这个后来的重复帖子中,建议使用ILMerge:https://dev59.com/questions/c3A75IYBdhLWcg3wf5NV - JohnLBevan
1
你可以将所有的dll文件嵌入到主dll中。请参考:https://dev59.com/qHVC5IYBdhLWcg3wxEJ1 - Marc van Nieuwenhuijzen
8个回答

63
在您的项目文件夹中有一个bin文件夹。在您的bin文件夹中,有2个文件夹,一个是Release,一个是Debug。对于您精练的.exe文件,您需要进入Release文件夹。
我不太确定这是否是您要询问的内容。

这对我也起作用了,简直不敢相信我找了多久才找到这个。 - rlb.usa
12
请注意,如果尚未构建发布版本,则必须在“构建”>“配置管理器”下选择“发布”选项来构建发布版本。 - intcreator
有点难懂,如果你问我。 - Jacob Sánchez
也适用于GUI应用程序。 如果应用程序需要任何非.NET dll,则您将在Release文件夹中看到它们与exe并列。 无论您将exe文件复制到哪里,都需要将dll复制到同一文件夹中。 正如Joe在他的回答中所说,运行您的exe的系统必须安装兼容的.NET框架。 - Skyfish

23

使用托管环境的任何程序都需要.NET框架支持(包括使用C#和VB.NET编写的程序)。

在这种情况下,您可以简单地重新分发您的.EXE,但如果用户没有安装适当的框架,则他们需要先安装它。


我可以使用C++/CLI或本机C++将其编译为exe吗? - Mohit Deshpande
1
无论如何,它都会编译成exe文件。但是,如果您尝试运行它,如果未安装.NET,则会返回错误。 - jalf
3
我很确定本地的、非托管的C++与.NET没有任何关系。你可以放心使用它而不必担心依赖项。 - alex
3
您可以使用非托管的 C++ 来避免依赖 .NET 运行时,但是根据 Visual Studio 版本的不同,用户可能需要相应的 Visual Studio 运行时 DLL(除非您完全静态链接,但这并不总是 100% 容易正确地完成)。 - Joe

23

如果我理解你的问题正确,是的,你可以这样做,但不能在Visual Studio中实现(根据我的了解)。 为了让编译器生成一个真正的、独立的可执行文件(这意味着您使用C#就像使用其他语言一样),您需要使用程序mkbundle(随Mono一起提供)。这将把您的C#应用程序编译成一个真正的、无依赖关系的可执行文件。

有很多关于这个问题的误解在互联网上流传。它并不像一些人所说的那样使.net框架失去意义,因为如果您一开始就没有使用这些功能,那么您怎么会失去未来的.net框架功能呢?当您对应用程序进行更新时,在构建安装程序之前通过mkbundle处理器运行它并不需要太多的工作。这还有一个加速的好处,使您的应用程序以本机速度运行(因为现在它是本机应用程序)。

在C++或Delphi中,您也有相同的系统,但没有中间的MSIL层。因此,如果您使用命名空间或源文件(在Delphi下称为单元),则编译并包含在您的最终二进制文件中。因此,您的最终二进制文件将更大(阅读:“真实应用程序”的“正常”大小)。对于您在.net中使用的框架部分,这些也会包含在您的应用程序中。但是,智能链接确实能减少相当多的体积。

希望这可以帮到您!


4

当您发布项目时,您可以将“部署模式”设置为“自包含”,然后选择“生成单个文件”的选项。

click to see the gif video


3

我同意@Marlon的观点。当您使用Release配置编译C#项目时,您将在项目的"bin/Release"文件夹中找到应用程序的可执行文件。对于简单的应用程序,这应该是有效的。

但是,如果您的应用程序依赖于一些外部dll,则建议您使用VisualStudio创建一个SetupProject。这样做,项目向导将查找应用程序的所有依赖项并将它们(库)添加到安装文件夹中。最后,您只需要在用户计算机上运行设置并安装软件即可。


这条评论似乎不适用于2019年的 dotnet core 用户:它是一个__.dll__文件,位于__bin/Debug__和__bin/Release__目录中。 - jsstuball

1

我从未遇到过部署C#编写的小型控制台应用程序的问题。你可能会遇到的唯一问题是依赖于.NET框架,但即使如此,这也不应该是一个主要问题。你可以尝试使用2.0版本的框架,这个版本已经在大多数PC上了。

如果使用本地的、非托管的C++,你就不应该有任何依赖于.NET框架的问题,所以你真的应该很安全。只需获取可执行文件和任何附带的文件(如果有的话),并将它们部署为原样;如果不想安装它们,也没有必要安装。


1

0

我认为不可能做到问题提问者所要求的,即通过将所有项目文件合并为一个 .exe 来避免 dll 地狱。

框架问题是一个误导。出现的问题是当您有多个项目依赖于一个库时,很难保持库同步。每次库发生更改时,所有依赖它且未更新的 .exes 都会死得很惨。

像某个回答中所说的让人学习 C 是傲慢和无知的。


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