【问题标题】:Group several files needed to run a program into one executable将运行程序所需的多个文件组合到一个可执行文件中
【发布时间】:2011-05-23 13:31:19
【问题描述】:

有时我会创建供个人使用的小项目。因此,我只需从我的项目中提取调试目录,并在需要使用我的应用程序时运行可执行文件。我怎样才能合并所有这些文件:

到一个可执行文件中。我知道我可以将该文件夹放在我的 C 驱动器中的某个位置,并有一个可执行文件的快捷方式。我只是想知道如何做到这一点。

【问题讨论】:

    标签: c# .net deployment executable


    【解决方案1】:

    这里有两点很重要:

    1. 您不应该分发应用程序的调试版本。始终以“发布”模式编译您的应用程序的最终版本,即您将让人们使用的版本(即使这些人只是您)。

      这样做的原因有很多,很多,但最明显的一个是在“发布”模式下编译将启用编译时和运行时优化,从而允许您的代码运行明显更快。

    2. 运行应用程序实际上需要您在其中显示的文件之一,那就是.EXE 文件本身。那是您必须分发的唯一一个。其余文件仅提供调试信息并由 Visual Studio 使用。由于您可能不需要在编写应用程序后对其进行调试,因此您根本不需要这些文件。

      事实上,您唯一需要分发 .EXE 文件之外的任何内容的情况是您的应用程序使用了 .DLL 库文件。它们可能是您从同一解决方案中的另一个项目自己创建的库,也可能是其他人编写的库,您正在使用这些库为自己的代码提供一些功能。

    【讨论】:

      【解决方案2】:

      您是否尝试仅将 exe 文件复制到单独的目录并运行该 exe?您的应用程序不需要运行屏幕截图中列出的其他 3 个文件。

      【讨论】:

        【解决方案3】:

        您不需要合并整个文件夹,您只需将一个文件“ConsoleApplication26.exe”移动到您喜欢的任何地方并自行愉快地运行它。其他文件仅包含在 Visual Studio IDE 中调试程序时使用的信息。

        【讨论】:

          【解决方案4】:

          在这种特定情况下,您只需要 .exe 文件,因为其余部分包含调试信息等。

          但一般来说 dll 文件可以放在全局程序集缓存(或 GAC)中。 MSDN article on the GAC 这应该 - 如 cmets 中所述 - 由安装程序处理,但这是避免将 dll 留在程序文件夹中的方法。正如 Cody 所提到的,通常将它们留在程序文件夹中会更好。

          如果您有图像或文本文件之类的资源,则可以通过在 Visual Studio 中将它们设置为嵌入资源来将它们嵌入到可执行文件中。

          然后它们可以作为正在执行的程序集中的流进行访问(this.GetType().Assembly.GetManifestResourceStream(name) 其中名称是默认命名空间“.”文件名。如果您想了解嵌入资源的名称,可以参考 GetManifestResourceNames 方法。

          但包含资源也意味着您必须重写一些资源加载以使用资源流,因此需要一些额外的工作。

          【讨论】:

          • 不,这是不正确的。一般来说,您应该在 GAC 中注册 DLL。您的分析与您引用的 MSDN 文章直接矛盾。更重要的是,永远不要尝试自己手动在 GAC 中注册 DLL。始终创建一个安装程序,在必要时为您执行此操作。
          • 嘿 - 对不起,我会改写,这不是作为建议,而是作为在问题中获得预期效果的一种方式。我个人没有注册,这是错误的。感谢您的澄清。我的目标是引起人们对嵌入式资源的关注。
          • 好的,但是仍然不是达到预期效果的方法。问题讨论的是 Xcopy 部署,长期以来被吹捧为针对 .NET Framework 的代码的主要优势之一。无需在 GAC 中安装 any 依赖项即可使其正常工作。它们应该简单地与您的应用程序一起放在文件夹中,或者如果绝对必要,可以使用 ILMerge 之类的工具将它们合并到一个程序集中。事实上,在 GAC 中注册依赖程序集意味着您不能使用 Xcopy 部署,正如同一篇 MSDN 文章所指出的那样。
          • 我完全同意,我从未在 GAC 中安装 dll 用于部署目的,因为它在重新部署时总是会出现问题。但我只会指出你的 CMET 对 GAC 的看法,因为他们肯定比我的要好:)
          • DLL应该在程序文件夹中。在全球范围内注册它们在很大程度上导致了通俗地称为“DLL Hell”的情况,.NET 和托管代码的现象本应得到解决。它并没有完全成功,但是保持依赖local确实有很大帮助。采用严格的本地依赖并将其提升为全局依赖只是糟糕的建议
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          相关资源
          最近更新 更多