我有一个resx文件,我想从几个解决方案\项目中使用它,我不希望在每个解决方案中都有本地副本(仅在编译时带来副本)。
有没有办法这样做?因为当我将其添加为“添加现有文件”时,它会在本地复制一份副本。
知道怎么做吗?
答案 0 :(得分:15)
如果您使用的是.resx文件,则可能希望利用Visual Studio为.resx文件提供的自动生成的代码功能。如果您在多个项目中包含.resx文件,那么您可能希望让每个项目自动生成自己的代码。您可能这样做是因为您想为某些项目使用不同的代码生成器(ResXCodeFileGenerator与GlobalResourceProxyGenerator),或者您可能只希望生成的代码的命名空间与项目一致。这是你如何设置它。
我已经使用名为SharedResx的C#控制台应用程序项目设置了一个新的解决方案。我还在名为Resources的解决方案中添加了一个C#类库项目,在该项目中我添加了一个名为MySharedResource.resx的新资源文件。 Visual Studio在我的Resources项目中自动创建一个MySharedResource.Designer.cs文件,其中包含Resources命名空间内的代码。
首先,将您现有的.resx文件作为链接包含在SharedResx控制台应用程序项目中,正如其他答案所提到的那样。添加现有项目 - > find .. \ Resources \ MySharedResource.resx - >使用“添加”按钮上的下拉列表选择“添加为链接”。
接下来,您必须手动修改项目文件以设置自动生成。您可以查看Resources.csproj以查看如何在其中设置自动生成,以指导它在SharedResx.csproj中的外观。 右键单击SharedResx项目,然后选择“卸载项目”。再次右键单击并选择Edit 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中“属性”窗口中的“自定义工具”设置指定Generator元素。
另请注意,在LastGenOutput元素中,我将生成的文件命名为SharedResx项目名称作为前缀。这将导致ResXFileCodeGenerator在与.resx文件相同的文件夹中创建名为SharedResx.MySharedResource.Designer.cs的文件。我已尝试在LastGenOutput元素中指定相对路径而不仅仅是文件名,以便将生成的文件放在不同的文件夹中,例如SharedResx文件夹,但我发现它不能始终如一地工作。虽然我第一次能够在正确的位置生成文件,但LastGenOutput元素会丢失其值,以便后续代不会定位到同一位置。我放弃了,只是使用项目名称前缀作为文件名的一部分,以避免与其他项目发生冲突。
现在,关闭SharedResx.csproj文件并再次右键单击以选择“重新加载项目”。右键单击SharedResx项目中链接的MySharedResource.resx文件,然后选择“运行自定义工具”。您现在应该看到名为SharedResx.MySharedResource.Designer.cs的新链接文件作为MySharedResource.resx文件下的嵌套文件添加到项目中。您可能必须打开“解决方案资源管理器”窗口中的“显示所有文件”选项才能看到它。
您现在可以从项目中包含的共享.resx文件自动生成代码文件。
答案 1 :(得分:7)
Visual Studio还允许您link to files而不是复制它们。该功能有点隐藏,但您可以像这样访问它:
答案 2 :(得分:2)
我实际上没有尝试使用resx文件,但你可以试试Adding As Link。
答案 3 :(得分:0)
我不知道为什么,但“添加为链接”对我来说没有按预期工作,它仍然尝试复制项目文件夹中的文件(如果使用Subversion Ankhsvn集成则不好)。 Here我写了一个循序渐进的指南,其方法类似于Wily博士的Apprentice,但有一些增强功能,比如真正的运行时共享资源。
答案 4 :(得分:0)
人们缺少的一个问题是,在选择要添加到.resx文件的文件时单击“添加”按钮时,没有“添加为链接”选项。诀窍是首先添加文件(该文件是您项目的资源)作为到项目的链接,并确保链接的文件位于名为“ Resources”的文件夹中,该文件夹位于.resx文件夹下文件将保留。然后,在您的.resx文件上,选择“添加现有文件”并找到您最初链接的文件。现在,由于Visual Studio将看到您链接的文件已经是项目中的链接,因此在您使用该链接时将使用链接建立您的项目。 (我们使用Visual Studio在2005年前完成了这种方式,今天我可以使用VS2019再次实现这一目的。
答案 5 :(得分:0)
人们缺少的一个问题是,在选择要添加到.resx文件的文件时单击“添加”按钮时,没有“添加为链接”选项。诀窍是首先添加文件(该文件是您项目的资源)作为到项目的链接,并确保链接的文件位于名为“ Resources”的文件夹中,该文件夹位于.resx文件夹下文件将保留。然后,在您的.resx文件上,选择添加现有文件并找到您最初链接的文件。现在,由于Visual Studio将看到您链接的文件已经是项目中的链接,因此它将使用链接的文件当您构建项目时(并在随后的编译中包括并更改该链接文件)。 (我们早在2005年就使用Visual Studio来使用这项技术,而今天我可以使用VS2019再次使用此技术。
答案 6 :(得分:-2)
在Visual Studio中,您可以在编译之前执行脚本,将文件复制到那里。