2010-09-17 3 views
9

He actualizado una aplicación C# WinForms de Visual C# 2008 (framework 3.5) a 2010 (framework 4.0) y obtengo errores en tiempo de ejecución.Recursos de ensamblaje FileNotFoundException en proyecto actualizado a VS 2010 framework 4.0

La aplicación carga ensamblajes dinámicamente en tiempo de ejecución utilizando Assembly.Load (nombre de archivo). Está diseñado de esta manera porque, dependiendo de la configuración de los usuarios, debe cargar diferentes implementaciones del ensamblaje ubicadas en diferentes carpetas.

Todo funciona bien, excepto cuando el DLL cargado tiene recursos incrustados (mapas de bits o xsd-bases de datos) entonces consigo FileNotFoundException:

{ "No se pudo encontrar 'FF.Fi_Stat.SKA.resources' de archivos." : null}

El ensamblado se llama FF.Fi_Stat.SKA.dll. No entiendo este mensaje porque no hay recursos externos (solo integrados) y VS no genera ningún archivo con ese nombre en el directorio de salida. ¿Algunas ideas?

-

Más detalles:

éste es cómo cargar el ensamblado:

Assembly a = Assembly.LoadFile(assemblyFileName); 

La carga real del conjunto de las obras, que es cuando intento crear una instancia de una clase dentro del ensamblado que ocurre la excepción:

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

Aquí está el Seguimiento de la pila:

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) 
    ... 

El seguimiento de pila de excepción:

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() 

ahora darse cuenta de que las DLL que no funcionan tiene esta línea en InitializeComponent en común:

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

Sin embargo como mencioné, esto no fue problema con el framework 3.5.

-

solución encontrada

descubrí que el problema estaba relacionado con la forma en el marco dotnet trató de encontrar recursos y después de añadir la siguiente línea a AssemblyInfo.cs en mis montajes comenzó a funcionar de nuevo.

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

Mejore su documentación del problema. Al menos un fragmento de código y el seguimiento de la pila de la excepción. –

+0

He agregado más detalles ahora, por favor revise otra vez. –

+1

Solución encontrada, notas añadidas a las anteriores. –

Respuesta

7

solución encontrada

descubrí que el problema estaba relacionado con la forma en el marco dotnet trató de encontrar recursos y después de añadir la siguiente línea a AssemblyInfo.cs en mis montajes que comenzó a trabajar de nuevo.

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

Puede probar enabling logging in the the Fusion loader. He tenido un gran éxito creando el valor DWORDEnableLog en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion a 1. A continuación, obtendrá mensajes de error de carga detallados en el registro de eventos.

+0

Gracias, acabo de probar esto, pero no estoy seguro de cómo usar la información. Puedo ver que intenta cargar el archivo .resources de mi dll cargado dinámicamente y no lo encuentra, pero no da ninguna pista de por qué se considera un error fatal en este caso, porque también puedo ver que intenta cargar no -existentes .resources archivos de mis ensamblados enlazados estáticamente sin generar una excepción al respecto. –

+1

La herramienta Fuslogvw.exe es la mejor ratonera aquí, no hay necesidad de hackear el registro. –

Cuestiones relacionadas