2010-09-17 71 views
9

我已经从C#WinForms应用程序从Visual C#2008(框架3.5)升级到2010(框架4.0),我得到运行时错误。程序集资源FileNotFoundException在项目升级到VS 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)] 
+0

改善您对该问题的记录。至少有一个代码片段和异常的堆栈跟踪。 – 2010-09-17 09:49:04

+0

我已经添加了更多详细信息,请再看一下。 – 2010-09-17 11:54:40

+1

找到解决方案,添加上面的注释。 – 2010-09-20 08:34:32

回答

7

发现的解决方案

我发现这个问题是关系到DOTNET框架如何试图找到本地化资源后,我在我的组件添加以下行的AssemblyInfo.cs它开始再次合作。

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

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

+0

谢谢,我只是试过这个,但我不确定如何使用这些信息。我可以看到它试图加载我的动态加载的dll的.resources文件,但没有找到它,但它没有给出任何提示,为什么它在这种情况下被认为是致命错误,因为我也可以看到它试图加载非 - 我的静态链接程序集的现有.resources文件没有引发异常。 – 2010-09-17 09:44:09

+1

Fuslogvw.exe工具在这里是更好的捕鼠器,不需要破解注册表。 – 2010-09-17 09:47:08