【问题标题】:How to have different solutions refer to one resx file?如何让不同的解决方案引用一个 resx 文件?
【发布时间】:2010-11-16 17:24:59
【问题描述】:

我有一个 resx 文件,我想从多个解决方案\项目中使用它,我不想在每个解决方案都有本地副本(仅在编译时带一份副本)。

有什么办法吗?因为当我将其添加为“添加现有文件”时,它会在本地复制一份副本。

知道怎么做吗?

【问题讨论】:

    标签: c# .net visual-studio


    【解决方案1】:

    如果您使用的是 .resx 文件,您可能希望利用 Visual Studio 为 .resx 文件提供的自动生成代码功能。如果您在多个项目中包含一个 .resx 文件,那么您可能希望每个项目自动生成自己的代码。您可能会这样做,因为您想为某些项目使用不同的代码生成器(ResXCodeFileGenerator 与 GlobalResourceProxyGenerator),或者您可能只是希望生成的代码的命名空间与项目保持一致。以下是您可以设置的方法。

    我使用名为 SharedResx 的 C# 控制台应用程序项目设置了一个新解决方案。我还在名为 Resources 的解决方案中添加了一个 C# 类库项目,并在该项目中添加了一个名为 MySharedResource.resx 的新资源文件。 Visual Studio 会自动在我的 Resources 项目中使用 Resources 命名空间内的代码创建一个 MySharedResource.Designer.cs 文件。

    首先,正如其他答案所提到的,将您现有的 .resx 文件作为链接包含在 SharedResx 控制台应用程序项目中。添加现有项目 -> 找到 ..\Resources\MySharedResource.resx -> 使用“添加”按钮上的下拉列表选择“添加为链接”。

    接下来,您必须手动修改项目文件以设置自动生成。您可以查看 Resources.csproj 以了解自动生成是如何设置的,作为它在 SharedResx.csproj 中的外观指南。 右键单击 SharedResx 项目并选择卸载项目。再次右键单击并选择编辑 SharedResx.csproj。 向下滚动以找到与链接的 .resx 文件对应的 EmbeddedResource 元素:

    <EmbeddedResource Include="..\Resources\MySharedResource.resx">
      <Link>MySharedResource.resx</Link>
    </EmbeddedResource>
    

    修改它以包含一个 Generator 元素和一个 LastGenOutput 元素:

    <EmbeddedResource Include="..\Resources\MySharedResource.resx">
      <Link>MySharedResource.resx</Link>
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>SharedResx.MySharedResource.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    

    注意:仅当您想控制生成文件的名称时,才需要手动编辑,就像我在示例中所做的那样。否则,您可以使用 Visual Studio 属性窗口中的自定义工具设置来指定生成器元素。

    还请注意,在 LastGenOutput 元素中,我使用 SharedResx 项目名称作为前缀命名了生成的文件。这将导致 ResXFileCodeGenerator 在与 .resx 文件相同的文件夹中创建一个名为 SharedResx.MySharedResource.Designer.cs 的文件。我已经尝试在 LastGenOutput 元素中指定相对路径而不仅仅是文件名,以使生成的文件位于不同的文件夹中,例如 SharedResx 文件夹,但我发现它不能始终如一地工作。虽然我第一次能够在正确的位置生成文件,但 LastGenOutput 元素丢失了它的值,因此后续代不会以相同的位置为目标。我放弃了,只是使用项目名称前缀作为文件名的一部分,以避免与其他项目可能发生冲突。

    现在,关闭 SharedResx.csproj 文件并再次右键单击以选择 Reload Project。右键单击 SharedResx 项目中链接的 MySharedResource.resx 文件,然后选择 Run Custom Tool。您现在应该看到名为 SharedResx.MySharedResource.Designer.cs 的新链接文件已作为嵌套文件添加到项目中,位于 MySharedResource.resx 文件下。您可能必须在解决方案资源管理器窗口中打开“显示所有文件”选项才能看到它。

    您现在拥有一个从项目中包含的共享 .resx 文件自动生成的代码文件。

    【讨论】:

    • 博士。威利的学徒:正是我所需要的
    【解决方案2】:

    Visual Studio 还允许您link to files 而不是复制它们。该功能有点隐藏,但您可以像这样访问它:

    1. 选择“添加现有文件”
    2. 选择文件后,不要双击,而是注意“打开”按钮旁边的小下拉箭头。
    3. 从下拉菜单中选择“链接文件”。

    【讨论】:

      【解决方案3】:

      我还没有真正尝试过使用 resx 文件,但您可以尝试 Adding As Link

      【讨论】:

        【解决方案4】:

        我不知道为什么,但是“添加为链接”对我来说没有按预期工作,它仍然尝试将文件复制到项目文件夹中(如果您使用 Subversion Ankhsvn 集成则不好)。 Here 我编写了一个分步指南,其方法类似于 Wily 博士的学徒方法,但有一些增强,例如资源的真正运行时共享。

        【讨论】:

          【解决方案5】:

          人们缺少的一个问题是,当您在选择要添加到 .resx 文件的文件时单击“添加”按钮时,您没有“添加为链接”选项。诀窍是首先将文件(作为项目资源的文件)添加为项目的链接,并确保链接的文件位于名为“Resources”的文件夹中,该文件夹位于 .resx 所在文件夹的下方文件将存在。然后,在您的 .resx 文件上,选择添加现有文件并找到您最初链接的文件。现在,因为 Visual Studio 将看到您正在链接的文件已经是您项目中的链接,所以当您构建你的项目。 (我们在 2005 年左右使用 Visual Studio 以这种方式完成了这项工作,而我今天使用 VS2019 又能做到这一点。

          【讨论】:

            【解决方案6】:

            人们缺少的一个问题是,当您在选择要添加到 .resx 文件的文件时单击“添加”按钮时,没有“添加为链接”选项。诀窍是首先将文件(作为项目资源的文件)添加为项目的链接,并确保链接文件位于名为“Resources”的文件夹中,该文件夹位于 .resx 所在文件夹的下方文件将存在。然后,在您的 .resx 文件上,选择添加现有文件并找到您最初链接的文件。现在,因为 Visual Studio 将看到您正在链接的文件已经是您项目中的链接,它现在将使用链接的文件当您构建项目时(并在后续编译中包含和更改该链接文件)。 (我们在 2005 年左右使用 Visual Studio 就使用了这种技术,而我今天使用 VS2019 又能做到这一点。

            【讨论】:

            【解决方案7】:

            在 Visual Studio 中,您可以在编译之前执行脚本,将文件复制到那里。

            【讨论】:

              猜你喜欢
              • 2013-09-12
              • 1970-01-01
              • 2019-09-20
              • 2011-07-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多