【问题标题】:How to deploy WinForms referenced assemblies that contain folders in their output如何部署在其输出中包含文件夹的 WinForms 引用程序集
【发布时间】:2013-04-24 11:27:15
【问题描述】:

我有一个 Winforms 项目 A,它引用了一个类库程序集 B。程序集 B 的文件夹包含设置为 Build Action = NoneCopy to Output Directory = True。这些文件夹和文件正确输出到程序集 B 的 bin 文件夹。它们不是引用文件,只是我需要在运行时从部署位置加载的文件。

在运行项目 A 时,程序集 B 中的代码需要访问所描述的文件夹和文件。 AppDomain.CurrentDomain.BaseDirectory 将为我提供项目 A 的运行位置,但该位置不存在文件夹和文件。如何在程序集 B 的 C# 代码中找到这些文件?

程序集 B 被编译成各种解决方案类型(winforms、Web 服务等),因此我需要一个适用于所有场景的部署。

我希望这是有道理的!我想我正在寻找 a) 对其部署方式的更改,以便文件夹和文件也在运行目录中,或者 b) 对程序集 B 中的代码进行更改。

如果有任何帮助,我将不胜感激!

【问题讨论】:

    标签: c# .net winforms deployment


    【解决方案1】:

    如果要在应用程序外部运送和使用程序集 B,我建议使文件夹嵌入资源而不是磁盘上的外部文件夹。这当然需要在应用程序中使用这些文件的任何地方进行代码更改,以便从 ResourceStreams 而不是磁盘上的文件中获取它们。

    如果文件夹只是应用程序运行时需要访问的数据,那么最简单的解决方案是将两个项目构建到一个公共输出目录。设置输出目录,例如

       bin\Debug
    

       ..\bin\Debug
    

    这样,A 和 B 的输出(包括文件夹)将位于同一目录中(如果项目正常位于解决方案目录下的文件夹中)。这也有助于加快构建速度。

    【讨论】:

    • 我不认为我可以让它们嵌入资源,因为在多个文件夹中有同名的文件。但是,如果我错了,请纠正我?
    • 对于一个通用输出文件夹,每个程序集的代码都位于完全不同的区域,所以我可能不得不在某个地方硬编码一个完整路径,不是吗?
    • Q1:你可以有一个嵌入资源的文件夹结构。 Q2:您的意思是这些项目不是同一个解决方案的一部分?
    • 我对嵌入式资源名称的理解是错误的:单独的文件夹给了我不同的命名空间。所以我认为我会使用这种方法。谢谢安德斯!
    • 同时发表评论。 Q2:项目是同一解决方案的一部分,但每个项目的代码位于完全不同的位置。 B 已添加到 A 的主要解决方案中,但如果有意义的话,它位于另一个文件夹中。
    【解决方案2】:

    您可以通过项目属性添加构建后事件。在这种情况下,您可以运行命令将程序集和文件夹及其内容复制到适当的位置。

    在您的代码中,如果您需要加载程序集的位置,那么您可以使用 Assembly.GetExecutingAssembly().CodeBase

    【讨论】:

    • 感谢 Jack,这可能会达到我想要的效果,尽管由于输出位置不同,复制命令需要以正在编译的父解决方案为条件。我现在可以很好地使用 Anders 的嵌入式资源了。
    猜你喜欢
    • 2022-01-07
    • 2018-10-23
    • 2013-03-02
    • 1970-01-01
    • 2014-08-13
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多