代码之家  ›  专栏  ›  技术社区  ›  Ville Krumlinde

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

  •  9
  • Ville Krumlinde  · 技术社区  · 14 年前

    我已经将C WinForms应用程序从Visual C 2008(Framework 3.5)升级到2010(Framework 4.0),并且出现运行时错误。

    应用程序在运行时使用assembly.load(文件名)动态加载程序集。它是这样设计的,因为根据用户配置,它应该加载位于不同文件夹中的程序集的不同实现。

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

    “找不到文件”ff.fi_stat.ska.resources“。”:空

    该程序集称为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在初始化组件中有以下共同点:

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

    不过,正如我提到的,框架3.5没有问题。

    ——

    找到解决方案

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

    [assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]
    
    2 回复  |  直到 13 年前
        1
  •  8
  •   Ville Krumlinde    13 年前

    [assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]
    
        2
  •  1
  •   Community CDub    8 年前

    enabling logging in the the Fusion loader DWORD EnableLog HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 1