项目中的程序集资源FileNotFoundException已升级到VS 2010 framework 4.0

时间:2010-09-17 09:12:09

标签: c# visual-studio-2010

我已将C#WinForms应用程序从Visual C#2008(框架3.5)升级到2010(框架4.0),并且我遇到了运行时错误。

应用程序使用Assembly.Load(filename)在运行时动态加载程序集。它是以这种方式设计的,因为根据用户配置,它应该加载位于不同文件夹中的程序集的不同实现。

一切正常,除非加载的dll有嵌入资源(位图或xsd数据集),然后我得到FileNotFoundException:

{“无法找到文件'FF.Fi_Stat.SKA.resources'。”:null}

程序集名为FF.Fi_Stat.SKA.dll。我不理解这条消息,因为没有外部资源(只有嵌入式资源),并且VS在输出目录中没有生成具有该名称的文件。有什么想法吗?

-

更多详情:

这是我加载程序集的方法:

Assembly a = Assembly.LoadFile(assemblyFileName);

程序集的实际加载工作,当我尝试在程序集内创建一个类的实例时发生异常:

Type t = a.GetType("nameofclass");
Activator.CreateInstance(t);  //fails here

这是堆栈跟踪:

Exception has been thrown by the target of an invocation.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   ...

内部异常堆栈跟踪:

   at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark)
   at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark)
   at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
   at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
   at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
   at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
   at System.Resources.ResourceManager.GetString(String name)
   at FF.Fi_Stat.SKA.RegForm.InitializeComponent()
   at FF.Fi_Stat.SKA.RegForm..ctor()

我现在意识到不起作用的dll在InitializeComponent中有这个共同点:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RegForm));

然而,正如我所提到的,框架3.5没有问题。

-

解决方案

我发现问题与dotnet框架如何尝试查找本地化资源有关,在我将以下行添加到程序集中的AssemblyInfo.cs后,它又开始工作了。

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]

2 个答案:

答案 0 :(得分:8)

解决方案

我发现问题与dotnet框架如何尝试查找本地化资源有关,在我将以下行添加到程序集中的AssemblyInfo.cs后,它又开始工作了。

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]

答案 1 :(得分:1)

您可以尝试enabling logging in the the Fusion loader。我在DWORDEnableLog中创建HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 1取得了巨大成功。然后,您将在事件日志中获得详细的加载错误消息。