gpt4 book ai didi

c# - 卫星资源 .dll 编译为错误的 .net 框架?

转载 作者:行者123 更新时间:2023-12-04 11:47:29 24 4
gpt4 key购买 nike

下面的程序应该从卫星资源文件中获取资源字符串。它在使用 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 并没有! (我想知道注册表数据库中是否有一些东西不会通过简单的重新安装来重置)

最佳答案

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

  • 在 Visual Studio 中,转到工具/选项/项目和解决方案/
    构建并运行并将 MS Build 项目构建输出详细程度设置为
    至少正常(默认为最小)。
  • 重建您的 .Net 3.5 项目。
  • 在输出/构建窗口中查找任务 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 - 解决方案(解决方法)
  • 转至 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets (确切的路径在您的系统上可能会有所不同,例如 Professional 而不是 Enterprise)。
  • 创建此文件的备份副本。
  • 编辑文件,找到一行包含文本 _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 将再次工作。

  • 原因
    这个问题是 introduced here在针对 x64 与 x86 时修复程序集链接器的一个小问题。如果您使用该 PR 关注评论线程,您会发现错误:修复中的实际变量在讨论后被重命名,但他们忘记在 PR 合并之前更新 AL 属性中的该变量。
    因此,al.exe 的 sdk 工具路径为空(它提到了一个不存在的变量),这导致 msbuild 始终调用默认值,这通常是系统上最新安装的框架 sdk 的 x86 版本——而不是与您的项目版本匹配的版本。
    那个版本的 .targets文件已通过 VS 更新推出。
    从那时起,他们就发现了错误并 fixed it .截至今天,该修复程序尚未推出。如果我正确理解了讨论,它的目标是使用 v16.11 发布。
    如果您等不及,请按照我上面描述的解决方法进行操作。

    关于c# - 卫星资源 .dll 编译为错误的 .net 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500679/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com