卫星资源.dll's编译到错误的.net框架

本文关键字:编译 错误 框架 net 资源 dll | 更新日期: 2023-09-27 18:12:01

下面的程序应该从卫星资源文件中获取一个资源字符串。当使用VS2015与目标框架=' . NET framework 4.5.2'编译时,它可以正常工作。但是,设置target framework=' . 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并没有帮助!(我想知道是否有一些东西在注册表数据库,不通过简单的重新安装重置)

卫星资源.dll's编译到错误的.net框架

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

问题确认

先确认问题。

  1. 在Visual Studio中,进入工具/选项/项目和解决方案/
    构建和运行并将MS构建项目构建输出详细度设置为至少Normal(默认为Minimal)。

  2. 重建。net 3.5项目

  3. 在Output/Build窗口中查找任务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

到目前为止,与hultqvist对这个问题的评论中提到的问题相同。然而,原因和解决办法是不同的。上面提到的注册表项在我的系统上是完全正常的。

TL;DR - Solution (Workaround)

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

    原因/h2>

    在这里引入这个问题是为了修复针对x64与x86的汇编链接器的一个小问题。如果你跟随那个PR的评论线程,你会发现错误:修复中的实际变量是在讨论后重命名的,但是他们忘记在合并PR之前在AL属性中更新它。

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

    该版本的.targets文件已经随着VS更新而推出。

    从那以后,他们发现了这个错误并修复了它。到今天为止,这个修复程序还没有推出。如果我对讨论的理解正确的话,它的目标是与v16.11一起发布。

    如果您等不及,请遵循我上面描述的解决方法。