卫星资源.dll编译错误的.net框架?

时间:2015-09-10 11:29:01

标签: c# .net resources satellite-assembly

下面的程序应该从卫星资源文件中获取资源字符串。使用VS2015使用目标框架='NET Framework 4.5.2'编译时,它工作正常。但是,设置目标框架='NET Framework 3.5'使其无法找到卫星资源文件并回退到默认资源。

我偷看了.exe和.dll文件,发现它们被编译成不同的.net版本(虽然它是生成它们的相同编译):

Main exe got:                  .Net Framework v3.5
Satellite resource dll got:    .Net Framework v4.0 

接口像卫星dll得到了错误的.Net版本。有没有人经历过这个并且有解决方案吗? (除了将项目升级到最新的.Net版本)

class Program
{
    static void Main(string[] args)
    {

        CultureInfo newCultureInfo = new System.Globalization.CultureInfo("da-DK");
        Thread.CurrentThread.CurrentUICulture = newCultureInfo;

        Console.WriteLine("Resource test");
        ResourceManager rm = new ResourceManager("ResourceTest.Resources.MyResources", Assembly.GetExecutingAssembly());

        Console.WriteLine(rm.GetString("hello"));

        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
编辑:像我对我的开发环境进行了一次糟糕的更新。重新安装整个计算机有帮助,但只是重新安装.Net和Visual Studio没有! (我想知道注册表数据库中是否有一些东西不能通过简单的重新安装重置)

1 个答案:

答案 0 :(得分:0)

我知道这个问题已经有将近六年的历史了,但今天这又是一个问题,在 Visual Studio 2019 中。我已经在 16.10.2 和 16.10.3(可能更多)中确认了它。构建 .Net 3.5 应用程序给我留下了非工作资源 dll,这让我感到困惑,直到我发现您的问题暗示要调查资源 dll .Net 版本,发现这些确实链接到 .Net 4 mscorlib 而不是 3.5。< /p>

问题确认

首先确认问题。

  1. 在 Visual Studio 中,转到工具/选项/项目和解决方案 /
    构建并运行并将 MS Build 项目构建输出详细程度设置为 至少正常(默认为最小)。

  2. 重建您的 .Net 3.5 项目。

  3. 在输出/构建窗口中查找任务 GenerateSatelliteAssemblies:。 下面的命令行显示了 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\al.exe,它是程序集链接器的 .Net 4.8 版本。在未受影响的系统上,这应该是 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\al.exe

到目前为止,问题与 link by hultqvist's comment 中提到的问题相同。然而,原因和解决方案是不同的。那里提到的注册表项在我的系统上完全没问题。

​​TL;DR - 解决方案(解决方法)

  1. 转到 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(具体路径可能因您的系统而有所不同,例如 Professional 而不是 Enterprise)。
  2. 创建此文件的备份副本。
  3. 编辑文件,找到包含文本 _ALExeToolPath 的行。它应该在第 3739 行附近。看起来像这样:
    <PropertyGroup>
      <_ALExeToolPath>$(TargetFrameworkSDKToolsDirectory)</_ALExeToolPath>
      <_ALExeToolPath Condition="'$(PlatformTarget)' == 'x64'">$(TargetFrameworkSDKToolsDirectory)$(PlatformTarget)\</_ALExeToolPath>
    </PropertyGroup>
  1. 现在向下滚动到下面的 AL 标记并找到 SdkToolsPath 属性。
    <AL AlgorithmId="$(Satellite_AlgorithmId)"
        BaseAddress="$(Satellite_BaseAddress)"
    ...
        SdkToolsPath="$(SdkToolsPathMaybeWithx64Architecture)"  <!-- this is incorrect -->
  1. 将属性值从 $(SdkToolsPathMaybeWithx64Architecture) 更改为 $(_ALExeToolPath)
  2. 保存文件(可能需要提升)
  3. 重建您的项目,使用正确的链接器,您的资源 dll 将再次运行。

原因

此问题是 introduced here,用于修复面向 x64 与 x86 时程序集链接器的小问题。如果您使用该 PR 关注评论线程,您会发现错误:修复中的实际变量在讨论后被重命名,但他们忘记在 PR 合并之前更新 AL 属性中的该变量。

因此,al.exe 的 sdk 工具路径为空(它提到了一个不存在的变量),这导致 msbuild 始终调用默认值,这通常是您的最新安装框架 sdk 的 x86 版本system -- 而不是与您的项目版本匹配的版本。

该版本的 .targets 文件已随 VS 更新一起推出。

他们从那时起就发现了错误并fixed it。截至今天,该修复程序尚未推出。如果我正确理解了讨论,它的目标是使用 v16.11 发布。

如果您等不及,请按照我上面描述的解决方法进行操作。