Zaktualizowałem aplikację WinForm C# z Visual C# 2008 (framework 3.5) do 2010 (framework 4.0) i otrzymuję błędy runtime.Zasoby zespołu FileNotFoundException w projekcie zaktualizowanym do wersji VS 2010 4.0
Aplikacja ładuje złożenia w sposób dynamiczny w czasie wykonywania za pomocą Assembly.Load (nazwa pliku). Został zaprojektowany w ten sposób, ponieważ w zależności od konfiguracji użytkownika powinien on ładować różne implementacje zespołu znajdującego się w różnych folderach.
Wszystko działa poprawnie, z wyjątkiem gdy dll załadowany ma wbudowanych zasobów (bitmap lub xsd-zbiorów danych), a następnie uzyskać FileNotFoundException:
{ „Nie można odnaleźć«FF.Fi_Stat.SKA.resources»Plik”. : null}
Zestaw nazywa się FF.Fi_Stat.SKA.dll. Nie rozumiem tego komunikatu, ponieważ nie ma żadnych zasobów zewnętrznych (tylko te osadzone) i żaden plik o tej nazwie nie jest generowany przez VS w katalogu wyjściowym. Jakieś pomysły?
-
Więcej szczegółów:
To jest jak załadować montaż:
Assembly a = Assembly.LoadFile(assemblyFileName);
Rzeczywiste obciążenie montażu działa, to jest, gdy próbuję utworzyć instancję klasa wewnątrz zespołu, w której wystąpił wyjątek:
Type t = a.GetType("nameofclass");
Activator.CreateInstance(t); //fails here
Tutaj jest ślad stosu:
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)
...
Wewnętrzna ślad wyjątek stosu:
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()
Teraz zdaję sobie sprawę, że DLL, które nie działają ma ten wiersz w InitializeComponent wspólnego:
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RegForm));
jednak jak już wspomniałem, nie było problemu z frameworkiem 3.5.
-
ROZWIĄZANIE FOUND
I okazało się, że problem wiązał się jak ramy dotnet próbowali znaleźć zlokalizowanych zasobów i po dodaniu następujący wiersz do AssemblyInfo.cs w moich zespołów znów zaczął działać.
[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)]
Ulepsz swoją dokumentację problemu. Przynajmniej fragment kodu i ślad stosu wyjątku. –
Dodałem więcej szczegółów, proszę spojrzeć jeszcze raz. –
Znaleziono rozwiązanie, dodane uwagi do powyższego. –