更改资源文件(resx)的命名空间和访问修饰符

58
在我的Web项目中,我在App_GlobalResources文件夹中使用了4个资源文件。其中一个(lang.resx)是在我加入该项目之前创建的。它具有正确的命名空间(WebApplication.App_GlobalResources)和访问修饰符:public
另一方面,我刚刚创建的另外三个资源文件具有不同的命名空间(Resources)和internal访问修饰符,我无法在Visual Studio的资源文件表单中更改它,因为它被禁用了。如果我试图直接在designer.cs文件中更改它,这些修改会在下次保存文件时被取消。
这不是关键性的错误,但对于其他开发人员来说,找到将要使用的资源文件具有不同的命名空间和访问修饰符可能会产生误导。
5个回答

87

简单来说,只需打开资源文件的属性并将 Custom Tool Namespace 更改为所需的命名空间即可。

就是这么简单。


3
VS2012的最简单回答: - Jeff Paquette
在<repo_name>/Properties目录中有一个.resx文件,我希望它位于我的主命名空间:<repo_name>。每次保存时,它都会更新为<repo_name>.Properties的命名空间。使用这个答案,我不必在每个地方都使用<repo_name>.Properties命名空间,而是让命名空间保持在<repo_name>。谢谢! - Jacob McKay
Visual Studio 2022已经发布。我把整个VB.net项目转换成C#时遇到了这个问题。手动更改文件中的命名空间是可行的,但ResX代码生成器会将其还原为“自定义工具命名空间”属性值。因此,我们必须在属性中更改它。 - Nandostyle

49

我不确定问题出在哪里,但是我可以告诉你,你可以通过更改用于生成代码的工具来解决它。

当我尝试跟随这篇文章时,我也遇到了这个问题。按照作者建议下载源文件后,我注意到已经存在的资源文件在“Custom Tool”属性中有以下类:“PublicResXFileCodeGenerator”。此外,“Build Action”属性被设置为“嵌入资源”,但我不确定这是否是问题的一部分。

我创建的任何新资源文件都使用自定义工具“GlobalResourceProxyGenerator”。将其覆盖为前面提到的“PublicResXFileCodeGenerator”似乎解决了问题,无论真正的问题是什么。

我还注意到现有的资源文件格式为“2.0”,而新文件格式为“1.3”。您可以在使用XML编辑器打开resx文件时(或者使用Visual Studio本身的“打开方式”)查看这一点。

我希望你能像这样工作,虽然不完美。这很可能是Visual Studio 2008和SP1的安装问题,或者类似的问题。

更新:

这篇博客文章也可能有所帮助。


非常有用的博客文章。谢谢! - Donald Byrd
1
这在VS2010中也会发生:将resx文件复制并粘贴到项目中可能是问题的原因,它会将.resx文件设置为GlobalResourceProxyGenerator。 - Chris S

11

或者您可以更改CustomTool属性(在VS2010中测试过)。

您只需打开资源文件的文件属性,将“Custom Tool”从“GlobalResourceProxyGenerator”更改为“PublicResXFileCodeGenerator”,这是本地资源文件的默认工具。接下来,您需要将“Build Action”更改为“嵌入式资源”。您可能还想分配一个适当的自定义工具命名空间,例如“Resources”,以便正确访问文件,但这并不是必要的...

来源


小心使用ASP.NET,因为在使用“嵌入式资源”发布时可能无法在服务器上发布。但是将“生成操作”设置为“内容”就可以正常工作。 - Wagner Leonardi

9

resx文件会根据在Visual Studio项目配置中指定的命名空间来选择。请更新项目以获得正确的命名空间,这样resx文件就能继承它(新的一定可以,现有的不确定是否能够修复-但应该可以)。


5

资源文件的访问修饰符在 .csproj 文件中;

直接更改 .csproj 文件可以解决这个问题。

查找 <Generator> 元素,并根据以下示例设置其值:

具有 internal 修饰符的资源文件如下所示,

<ItemGroup>
 <EmbeddedResource Update="resources.resx">
  <Generator>ResXFileCodeGenerator</Generator>
  <LastGenOutput>resources.Designer.cs</LastGenOutput>
 </EmbeddedResource>
</ItemGroup>

一个使用public修饰符的资源文件看起来像这样。

<ItemGroup>
 <EmbeddedResource Update="resources.resx">
  <Generator>PublicResXFileCodeGenerator</Generator>
  <LastGenOutput>resources.Designer.cs</LastGenOutput>
 </EmbeddedResource>
</ItemGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接