卫星资源.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并没有帮助!(我想知道是否有一些东西在注册表数据库,不通过简单的重新安装重置)
我知道这个问题已经有六年了,但今天又出现了Visual Studio 2019的问题。我已经用16.10.2和16.10.3(可能更多)确认了。构建。net 3.5应用程序给我留下了非工作资源dll,这让我感到困惑,直到我发现你的问题暗示要调查资源dll的。net版本,发现这些确实链接到。net 4 mscorlib而不是3.5。
问题确认
先确认问题。
在Visual Studio中,进入工具/选项/项目和解决方案/
构建和运行并将MS构建项目构建输出详细度设置为至少Normal(默认为Minimal)。重建。net 3.5项目
在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
。
TL;DR - Solution (Workaround)
- 转到
C:'Program Files (x86)'Microsoft Visual Studio'2019'Enterprise'MSBuild'Current'Bin'Microsoft.Common.CurrentVersion.targets
(在您的系统上,确切的路径可能会有所不同,例如,专业而不是企业)。 - 创建此文件的备份副本
- 编辑文件,找到包含文本
_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更新而推出。
如果您等不及,请遵循我上面描述的解决方法。