Я обновил приложение C # WinForms с Visual C # 2008 (framework 3.5) до 2010 (framework 4.0) и получаю ошибки времени выполнения.
Приложение загружает сборки динамически во время выполнения с помощью Assembly.Load (имя файла).Он спроектирован таким образом, потому что в зависимости от конфигурации пользователя он должен загружать разные реализации сборки, расположенные в разных папках.
Все работает нормально, за исключением случаев, когда загруженный 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));
Однако, как я уже упоминал, это не было проблемой для framework 3.5.
-
НАЙДЕНО РЕШЕНИЯ
Я обнаружил, что проблема была связана с тем, как среда dotnet пыталась найти локализованные ресурсы, и после того, как я добавиласледующая строка в AssemblyInfo.cs в моих сборках снова заработала.
[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]