如何将嵌入式字符串资源的.NET 3.5兼容组件移植到.NET 4.0?

时间:2011-11-16 17:22:12

标签: .net-4.0 porting .net-assembly

我正在将一些基于.NET-3.5的项目转换为.NET Framework 4.0,并且在使用嵌入式程序集的字符串资源时遇到了麻烦。

代码包含对Resources.ValidationFailedMsg等资源字符串的引用。 Resources这是一个自动生成的类。它的完全限定名称是MyAssembly.Properties.Resources(程序集名称是MyAssembly.dll,为了简单起见,其中所有内容的根名称空间也是MyAssembly)。项目的“Properties”文件夹包含Resources.resx,其中定义了字符串ValidationFailedMsg(例如“Validation failed!”),并从中生成Resources.Designer.cs文件。

现在让我们运行这个东西。这是发生的事情:

System.IO.FileNotFoundException:无法加载文件或程序集'MyAssembly.resources ....

对不起,什么文件???

首先,我理解二进制 .resource 文件的概念,以及许多文化可能有多少这样的文件,但让我们先得到一个默认文化。从.NET 2.0到此项目的3.5兼容版本,所有字符串都嵌入在程序集本身中,因此除了MyAssembly.dll之外,框架甚至都没有查找它们。 如何让它看到装配体而不是看其他任何东西?

其次,我注意到项目的bin \ Debug目录中有一个 .resource 文件,但它名为MyAssembly.Properties.Resources.resources,而不是MyAssembly.resources,并且msbuild没有将其复制到bin \ Debug或引用MyAssembly的任何其他位置。这对这里可能出现的问题有用吗?

第三,我可以在Visual Studio 2010中打开一个新的空项目,在属性下添加Resources.resx,在那里放一个字符串,在代码中引用它作为TestProject.Properties.Resources.String1,build,它就像魅力。但是在旧项目中,即使用字符串读取Resource.resx也无济于事。

你能解释为什么.NET 4.0将这些字符串编译到一个地方,然后在不同的地方查找它们,导致FileNotFoundException?将具有此类嵌入式字符串资源的.NET 3.5兼容程序集迁移到.NET 4.0的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

神秘解决了。

.NET(4.0之前)首先查找.resource文件。如果找不到该文件,它会查看程序集内部以查找所请求的资源。

从.NET 4.0开始,如果.resource文件不存在,框架将触发AppDomain.AssemblyResolve事件并传递资源文件名来代替程序集名称。(为什么AssemblyResolve? - 这可能是一个错误。)只有在没有处理此事件的情况下,.NET 4.0才会查看资源的程序集内部。

实际上,应用程序已注册AssemblyResolve处理程序。处理程序被编程为定位DLL,直到.NET 4.0升级的那一天,当它被要求找到不存在的资源文件时,它从未失败多年。