Ресурсы сборки FileNotFoundException в проекте обновлены до VS 2010 framework 4.0 - PullRequest
9 голосов
/ 17 сентября 2010

Я обновил приложение 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)]

Ответы [ 2 ]

8 голосов
/ 09 февраля 2012

РЕШЕНИЕ НАЙДЕНО

Я обнаружил, что проблема связана с тем, как платформа dotnet пыталась найти локализованные ресурсы, и после того, как я добавил следующую строку в AssemblyInfo.cs в моих сборках, онснова начал работать.

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]
1 голос
/ 17 сентября 2010

Вы можете попробовать , включив вход в загрузчик Fusion .У меня был большой успех при создании значения DWORD EnableLog в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion до 1.После этого вы получите подробные сообщения об ошибках загрузки в журнале событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...