• .NET Core 如何禁止.resx文件自动生成Designer.cs
  • 发布于 2个月前
  • 230 热度
    0 评论
  • 王髪
  • 1 粉丝 36 篇博客
  •   
在 Visual Studio 中,如果我们在一个 .NET Core 工程里加入了一个资源文件(.resx),那么你会发现有个对应的 .Designer.cs 文件被自动生成了,每次资源文件的内容有变化,这个设计器文件都会刷新。它本质上就是对应资源文件里的键值对,自动生成访问这些资源的方法。

生成的代码就像这样:
private static global::System.Resources.ResourceManager resourceMan;

private static global::System.Globalization.CultureInfo resourceCulture;

[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal DataResource() {
}

/// <summary>
///   Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Moonglade.Setup.Data.DataResource", typeof(DataResource).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

/// <summary>
///   Overrides the current thread's CurrentUICulture property for all
///   resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
    get {
        return resourceCulture;
    }
    set {
        resourceCulture = value;
    }
}
对于资源文件里的每个Key,都会有个方法来读它的值
/// <summary>
///   Looks up a localized string similar to {&quot;Name&quot;:&quot;Admin&quot;,&quot;Description&quot;:&quot;Moonglade
Admin&quot;,&quot;ShortDescription&quot;:&quot;Moonglade Admin&quot;,&quot;AvatarBase64&quot;:&quot;&quot;}.
/// </summary>
internal static string BlogOwnerSettings {
    get {
        return ResourceManager.GetString("BlogOwnerSettings", resourceCulture);
    }
}
但是,我不希望使用这些代码来读取资源文件。因此我需要禁用自动生成Desinger.cs文件。
事实上,这个Designer.cs文件的生产方式是通过CustomTool生成的,就像EF4-6时候通过T4模板生成代码一样,也是一种CustomTool。给资源文件(.resx)生成对应的 .Designer.cs 文件的CustomTool叫做ResXFileCodeGenerator

在 Visual Studio 中,你可以在RESX文件的属性窗口里将它设置为 <reset to default> 从而关闭这货

如果你用的是 Visual Studio Code,可以手工编辑csproj文件,删除这段:
<ItemGroup>
  <Compile Update="Data\DataResource.Designer.cs">
    <DesignTime>True</DesignTime>
    <AutoGen>True</AutoGen>
    <DependentUpon>DataResource.resx</DependentUpon>
  </Compile>
</ItemGroup>

<ItemGroup>
  <EmbeddedResource Update="Data\DataResource.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>DataResource.Designer.cs</LastGenOutput>
  </EmbeddedResource>
</ItemGroup>
那么现在,我们如何从资源文件里读取字符串呢?很简单:
ResourceManager rm = new ResourceManager("Moonglade.Setup.Data.DataResource", Assembly.GetExecutingAssembly());
rm.GetString("Your_Resource_Key");

关于为什么要禁用的说明:

1. 访问级别是internal,外部要访问除非设置代理class 

2. 在团队中,如果不是每个人都有一样的开发环境,比如对方没用VS,没用VSCode,用的是三方IDE,不能保证这个customtool一定有执行能力 

3. 不同人修改资源文件之后,版本控制容易有merge issue 

4. 到底要不要禁用,取决于各自的项目情况,没有绝对的应不应该禁用。

用户评论