.Net整个应用程序作为单个.exe文件?

时间:2010-07-16 04:30:16

标签: c# .net vb.net

我开发了一些没有数据库的软件。我想创建一个.Net项目的.exe,所以我只能给用户使用该软件。

不幸的是我不知道如何在.Net中创建我项目的.exe。

有人对这个问题有指导吗?

9 个答案:

答案 0 :(得分:27)

或许像ILMerge这样的东西?

甚至有GUI

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

最终找到了完美的answer

要发布整个没有图片的页面,因为该页面太旧了,我怕它会被删除。

对我来说,我没有打扰说“请勿复制”。另外,由于无法添加它们,我完全跳过了第4步。我想知道它是否与Nuget Manager已添加它有关。

最后,我可以拔出exe文件并在HDD的任何位置运行它。

从上面的链接复制:

前一段时间,我正在使用一个小型C#WinForms应用程序 Visual Studio2008。为简化部署过程 该应用程序的所有组件都捆绑在一起 exe文件将使其更易于管理。但是-文档和 在exe文件中嵌入dll文件的教程已过时, 不完整或根本不起作用。

最好的例子是摘自一本书的摘录 由其作者撰写的MSDN博客。不幸的是,它没有按提示的方式工作 并且没有包含有关如何或在何处实施的明确说明。 但是,它仍然提供了一个很好的起点。经过一些 研究,试验和错误,并在Visual Studio的帮助下 调试器,这是解决方案。

注意:此方法允许您将dll文件放入任何子文件夹或 项目中的一系列子文件夹,而无需更改任何子文件夹 事实之后的代码。如果您希望放弃使用子文件夹 (将dll文件放置在项目根目录中),或使用硬编码路径 到包含dll文件的子文件夹中, 替代方法会更合适,但不会 在这里覆盖。

  1. dll文件本身需要嵌入到Visual Studio中 项目,而不只是引用。在您的项目中,创建一个文件夹 在项目的根目录中以存储dll文件(右键单击 项目名称>添加>新文件夹)。我将我命名为“ lib”。

  2. 复制并粘贴您的dll(以及所有附带的支持或定义) 文件)放入lib文件夹。就本教程而言,示例 使用的dll是决明子。

  3. 接下来,将dll包含为项目资源。右键点击 项目名称>属性(或“项目”菜单> yourprojectname 属性)。转到“资源”标签。

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

单击“添加资源”,将文件类型更改为“所有文件”,然后 导航到您的dll所在的“ lib”文件。选择它并 点击“打开”。

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

  1. 在项目中添加对dll文件的引用。在解决方案中 在“资源管理器”窗格中,右键单击“参考”>“添加参考”(或者, 项目菜单>添加参考)。单击浏览选项卡,导航到 dll所在的lib文件夹,选择dll文件,然后单击 “好”。对dll的引用将出现在引用下 项目中的文件夹。

  2. 默认情况下,已编译的文件和项目引用被复制到 生成项目时的bin文件夹。这将需要防止。 在“引用”文件夹下,选择对您的dll文件的引用。 在属性窗格中(或右键单击>属性),查找 属性名为“复制到输出目录”,并将值设置为 错误。

接下来,选择“ lib”文件夹下的dll文件。在属性 窗格中,查找“复制到输出目录”属性并设置 值设置为“请勿复制”。

还要查找“ Build Action”属性,并将其值设置为 “嵌入式资源”。这表明将如何处理文件以及 在构建项目时访问。

最后,排除dll文件随附的无关文件,例如 帮助文件和XML定义文件-不需要 项目何时构建。右键单击文件(例如XML 定义文件),然后单击“从项目中排除”。现在不会 在构建项目时将其复制到bin文件夹。

  1. 在执行WinForm的代码视图中,包含名称空间 System.Reflections。这对于某些负责的代码很重要 用于加载您的嵌入式dll文件。

  2. 在执行WinForm的代码视图中,此代码应为 放置在构造函数方法中(通常与表单相同)。 它需要出现在InitializeComponent()方法之前: AppDomain.CurrentDomain.AssemblyResolve + =(sender,args)=> { 字符串resourceName = new AssemblyName(args.Name).Name +“ .dll”; 字符串资源= Array.Find(this.GetType()。Assembly.GetManifestResourceNames(),元素 => element.EndsWith(resourceName));

    使用(var stream = Assembly.GetExecutingAssembly()。GetManifestResourceStream(resource)) { Byte [] assemblyData =新的Byte [stream.Length]; stream.Read(assemblyData,0,assemblyData.Length); 返回Assembly.Load(assemblyData); }; ```

启动exe时,此代码负责检测什么 dll文件是必需的,正在被引用,并从中加载它们 它们的嵌入位置。

  1. 在正在执行的WinForms应用程序的代码视图中,您可以 现在包括dll文件的名称空间。

  2. 为了测试所有内容,您需要从 dll文件的名称空间,以便AssemblyResolve事件为 触发。但是,如果您包含DLL命名空间中的代码 在构造函数中,Application.Run()将抛出“文件不 WinForms应用程序生成时,dll文件的“发现”错误 并执行。

要纠正此问题,您将需要使用dll文件放置任何代码 构造方法之外的另一个方法中的名称空间。这是 因为汇编器的事件处理程序不能位于 调用它的方法相同。这很简单,但是 仅需注意的一个警告。

答案 3 :(得分:0)

在Visual Studio中构建项目时会自动创建.exe。 它可以在项目的/ bin / debug或/ bin / Release文件夹中找到。但是,如果该文件夹包含除.exe之外的其他文件,则应向最终用户提供整个Debug或Release文件夹。

PS:建议您仅提供.exe的“发布”版本,而不是“调试”。

答案 4 :(得分:0)

我已经试过了:

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

它们都有效,但是当我尝试将它们复制到另一台 PC 时,它们都被 Windows Defender 标记为恶意软件 (2021-06-17)。对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

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

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

答案 7 :(得分:-1)

答案 8 :(得分:-2)

其他人已经解决了.exe问题,因此在一般的开发点上,您可能不想查看代码并确定可在未来开发中重复使用的函数/类。

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

相关问题