如何有不同的解决方案参考一个resx文件?

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

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

知道怎么做吗?

如果您使用的是.resx文件,则可能希望利用Visual Studio为.resx文件提供的自动生成的代码function。 如果您在多个项目中包含.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项目,然后选择“卸载项目”。 再次右键单击并选择Edit SharedResx.csproj。 向下滚动以查找与链接的.resx文件对应的EmbeddedResource元素:

 MySharedResource.resx  

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

  MySharedResource.resx ResXFileCodeGenerator SharedResx.MySharedResource.Designer.cs  

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

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

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

您现在可以从项目中包含的共享.resx文件自动生成代码文件。

Visual Studio还允许您链接到文件而不是复制它们。 该function有点隐藏,但您可以像这样访问它:

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

我实际上没有尝试使用resx文件,但您可以尝试添加为链接 。

我不知道为什么,但“添加为链接”对我来说没有按预期工作,它仍然尝试复制项目文件夹中的文件(如果使用Subversion Ankhsvn集成则不好)。 在这里,我写了一个循序渐进的指南,其方法类似于Wily博士的Apprentice,但有一些增强function,比如真正的运行时共享资源。

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