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

z2acfund  于 2023-05-08  发布在  .NET
关注(0)|答案(9)|浏览(459)

我开发了一些没有数据库的软件。我想为我的.NET Framework项目创建一个独立的.exe,这样我就可以只将.exe文件提供给用户来使用该软件。
不幸的是,我不知道如何在. Net中创建我的项目的独立.exe。
有没有人对这个问题有指导?

pengsaosao

pengsaosao1#

比如ILMerge
甚至还有一个GUI
注:实际上我没有试过。

f87krz0w

f87krz0w2#

还有Costura.Fody插件,它将所有内容编译成一个不需要安装的exe文件。它可以通过nuget安装,但是最新版本的nuget会阻止创建FodyWeavers.xml文件,所以这需要手动完成。

m0rkklqb

m0rkklqb3#

终于找到完美的answer
要张贴整个页面没有图片,因为页面太旧了,我担心它会被删除。
对我来说,我没有费心让引用“不要复制”。此外,我完全跳过了第4步,因为我不能添加它们。我想知道这是否与它已经被添加的掘金经理。
最后,我可以直接取出exe文件,并从我的硬盘上的任何地方运行它。
复制自上面的链接:
不久前,我在Visual Studio 2008中开发了一个小型的C# WinForms应用程序。为了简化应用程序的部署过程,将其所有组件捆绑到一个exe文件中将使其更易于管理。但是,有关在exe文件中嵌入dll文件的文档和教程已经过时,不完整,或者根本不起作用。
最好的例子是一本书的摘录,由作者发布在MSDN博客上。不幸的是,它并没有像介绍的那样工作,也没有包括关于如何或在哪里实现它的明确说明。但它仍然提供了一个很好的起点。经过一些研究、试验和错误,并在Visual Studio调试器的帮助下,解决方案如下。
注意:此方法允许您将dll文件放置到项目中的任何子文件夹或一系列子文件夹中,而无需在事后更改任何代码。如果你想放弃使用子文件夹(将dll文件放在项目根目录下),或者使用包含dll文件的子文件夹的硬编码路径,还有更合适的替代方法,但这里不会介绍。

  1. dll文件本身需要嵌入到VisualStudio项目中,而不仅仅是引用。在你的项目中,在项目的根目录下创建一个文件夹来存储dll文件(右键单击项目名称>添加>新建文件夹)。我给我的取名为“自由”。
    1.复制并粘贴您的dll(以及任何附带的支持或定义文件)到lib文件夹中。在本教程中,使用的示例dll是Cassia。
    1.接下来,将dll作为项目资源包含进来。右键单击项目名称>属性(或项目菜单>您的项目名称属性)。转到“资源”选项卡。
    选择“文件”,如下图所示:
    单击“添加资源”,将文件类型更改为“所有文件”,并导航到您的dll所在的“lib”文件。选择它并单击“打开”。
    dll文件现在应该作为项目资源包括在内:
    1.在项目中添加对dll文件的引用。在解决方案资源管理器窗格中,右键单击“引用”>添加引用(或者,项目菜单>添加引用)。单击Browse选项卡,导航到dll所在的lib文件夹,选择dll文件,然后单击“Ok”。对dll的引用将出现在项目中的references文件夹下。
    1.默认情况下,生成项目时,已编译的文件和项目引用将复制到bin文件夹中。必须防止这种情况发生。在“References”文件夹下,选择对dll文件的引用。在属性窗格中(或右键单击> properties),查找名为“Copy to output directory”的属性,并将值设置为false。
    接下来,选择“lib”文件夹下的dll文件。在属性窗格中,查找属性“复制到输出目录”并将值设置为“不复制”。
    同时查找属性“Build Action”并将其值设置为“Embedded Resource”。这指示在生成项目时将如何处理和访问文件。
    最后,排除dll文件附带的无关文件,如帮助文件和XML定义文件--在生成项目时,项目中不需要这些文件。右键单击文件(如XML定义文件),然后单击“从项目中排除”。现在,在生成项目时,它将不会复制到bin文件夹中。
    1.在执行WinForm的代码视图中,包括命名空间System. Reflections。这对于一些负责加载嵌入式dll文件的代码很重要。
    1.在执行WinForm的代码视图中,此代码应放置在构造函数方法中(通常与窗体名称相同)。它需要出现在InitializeComponent()方法之前:Copyright © 2019 - 2019 All Rights Reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved. All rights reserved 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]; System. out. println(); return Assembly.Load();联系我们
    在启动exe时,此代码负责检测需要哪些dll文件,哪些dll文件被引用,并从其嵌入位置加载它们。
    1.在正在执行的WinForms应用程序的代码视图中,现在可以包含dll文件的命名空间。

1.为了测试所有内容,您需要从dll文件的命名空间实现代码,以便触发AssemblyResolve事件。但是,如果在构造函数中包含dll的命名空间中的代码,则在生成和执行WinForms应用程序时,Application.Run()将为dll文件抛出“文件未找到”错误。
若要更正此问题,您需要将使用dll文件命名空间的任何代码放置在构造函数方法之外的另一个方法中。这是因为汇编程序的事件处理程序不能位于调用它的同一方法中。这很容易做到,但这只是需要注意的一个警告。

wqlqzqxt

wqlqzqxt4#

我试过了:

  • ILMerge
  • Costura.Fody
  • 将文件添加到资源中并编译一个新的exe,它将启动带有dll的原始exe。

它们都能正常工作,但当我试图将它们复制到另一台PC时,它们都被Windows Defender标记为恶意软件**(2021-06-17)。对virustotal的快速扫描证实,这也会影响其他反病毒解决方案。似乎改变加载DLL的方式会触发反病毒启发式。
然后,我尝试使用自解压归档文件来简单地在启动时解压缩程序,并从临时目录中使用DLL启动程序。我已经尝试了7z和Winrar与各种不同的设置。我找到的唯一可靠的组合是:

  • 使用WinRar v6.02(在撰写本文时为当前版本,其他版本也可能适用)
  • 保持启用提取对话框(隐藏它们会增加误报)
  • 使用64位zip压缩(使用32位zip或rar也会增加误报)

这给了我一个exe文件,我可以双击启动程序,但需要注意的是,它不会在32位上运行,并且提取对话框将在启动时显示短暂的一秒钟。
这样,我在www.example.com上实现了0/66的检测率virustotal.com:https://www.virustotal.com/gui/file-analysis/MDMxZmI3OWZiYTU3MTU1YWIxYmFmYTM0MjM4ZmE1MmE6MTYyMzkzMjY4OA==/detection
显然,这在将来可能会改变,所以更可靠的方法可能是简单地将exe与dll一起作为压缩目录分发,或者使用安装程序。

aurhwmvo

aurhwmvo5#

在Visual Studio中生成项目时会自动创建.exe。它可以在项目的/bin/debug或/bin/Release文件夹中找到。但是,如果Debug或Release文件夹中包含除. exe之外的其他文件,则应向最终用户提供整个Debug或Release文件夹。
PS:建议您只提供您的.exe的“发布”版本,而不是“调试”版本。

uqcuzwp8

uqcuzwp86#

其他人已经解决了.exe的问题,所以在一般的开发点上,你可能想检查你的代码,并确定你可以在未来的开发中重用的函数/类。
然后,您可以将这些内容提取到一个单独的.DLL中,并仍然为您的用户提供软件,但下一个应用程序的开发将更容易一些,并且对功能的任何改进都可以在两个应用程序中轻松采用。

oxiaedzo

oxiaedzo7#

创建一个安装项目(在msdn中查找),在安装程序中打包项目输出文件。Visual studio创建安装程序和引导exe文件,则可以使用exe或msi文件来运行应用程序。

f5emj3cl

f5emj3cl8#

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

zengzsys

zengzsys9#

.Net项目在编译时会在应用程序属性中设置的调试/发布路径上提供一个exe文件。我想你是要求自解压应用程序安装exe文件给予它的用户使用该软件,而不给任何相关的源代码或项目文件。要尝试打包,你可能可以使用免费的应用程序打包程序,尝试innosetup或Nsis,你可以将其打包到一个安装文件中。我使用Innosetup和它的简单。

相关问题