我已经从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)]
改善您对该问题的记录。至少有一个代码片段和异常的堆栈跟踪。 – 2010-09-17 09:49:04
我已经添加了更多详细信息,请再看一下。 – 2010-09-17 11:54:40
找到解决方案,添加上面的注释。 – 2010-09-20 08:34:32