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)]
Mejore su documentación del problema. Al menos un fragmento de código y el seguimiento de la pila de la excepción. –
He agregado más detalles ahora, por favor revise otra vez. –
Solución encontrada, notas añadidas a las anteriores. –