You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Studio 2019与MSBuild生成.NET 4资源附属DLL而非.NET 3.5导致本地化失效问题

解决.NET 3.5项目中resx附属DLL目标框架不匹配导致区域性无效的问题

你猜得没错,这个问题的核心确实出在al.exe(程序集链接器)的版本上!.NET 4.8 SDK附带的al.exe会默认生成面向.NET 4.0及以上版本的附属程序集,而.NET 3.5的运行时环境无法正确识别这些高版本的DLL,直接就忽略了你设置的区域性配置。下面给你几个靠谱的解决办法:

方法一:手动指定.NET 3.5对应的al.exe版本

  1. 先找到Windows SDK 7里的al.exe路径,一般是C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\al.exe(32位系统去掉路径里的(x86))。
  2. 打开项目属性的生成事件面板:右键项目 → 属性 → 生成事件 → 后期生成事件命令行。
  3. 替换默认的编译命令,手动调用正确版本的al.exe来处理resx资源。举个例子,如果你要生成中文(简体)的附属DLL,命令大概是这样:
    "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\al.exe" /t:lib /culture:zh-CN /out:$(OutputPath)\zh-CN\YourProject.resources.dll /embed:$(IntermediateOutputPath)\YourProject.zh-CN.resources
    
    记得把YourProject换成你自己的项目名称,zh-CN换成你需要的区域性代码,每个语言版本都要对应添加一条命令。

方法二:修改项目文件强制绑定SDK工具链

这个方法一劳永逸,不用每次手动写命令:

  1. 右键项目 → 卸载项目 → 编辑你的.csproj文件。
  2. <PropertyGroup>节点里添加下面的配置,强制项目使用.NET 3.5对应的SDK工具:
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <SDKToolsPath>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin</SDKToolsPath>
    <GenerateResourceToolExe>$(SDKToolsPath)\resgen.exe</GenerateResourceToolExe>
    <AlToolExe>$(SDKToolsPath)\al.exe</AlToolExe>
    
  3. 保存文件后重新加载项目,之后编译时会自动调用正确版本的resgen.exeal.exe,生成的附属DLL就会是.NET 3.5版本的了。

最后验证一下

重新编译项目后,用dotPeek检查输出目录下的附属DLL,确认目标框架是.NET 3.5,然后运行项目测试区域性切换,应该就能正常加载对应语言的翻译内容了。

另外提醒下,如果你的电脑上还没装Windows SDK 7,去微软官方渠道下载安装就行,同时确保项目的目标框架确实设置成了.NET 3.5(右键项目 → 属性 → 应用程序 → 目标框架)。

内容的提问来源于stack exchange,提问作者Panagiotis Lefas

火山引擎 最新活动