2010-09-17 13 views
9

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)] 
+0

Ulepsz swoją dokumentację problemu. Przynajmniej fragment kodu i ślad stosu wyjątku. –

+0

Dodałem więcej szczegółów, proszę spojrzeć jeszcze raz. –

+1

Znaleziono rozwiązanie, dodane uwagi do powyższego. –

Odpowiedz

7

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 zaczęło znów działać.

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

Możesz spróbować enabling logging in the the Fusion loader. Odniosłem wielki sukces, tworząc wartość DWORD o wartości EnableLog w HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion na 1. Otrzymasz wtedy szczegółowe komunikaty o błędach ładowania w dzienniku zdarzeń.

+0

Dzięki, po prostu próbowałem, ale nie jestem pewien, jak korzystać z informacji. Widzę, że próbuje załadować plik .resources mojego dynamicznie ładowanego dll i nie może go znaleźć, ale nie daje żadnej wskazówki dlaczego jest uważany za fatalny błąd w tym przypadku, ponieważ widzę również, że próbuje załadować non -istniejące pliki .resources moich statycznie połączonych złożeń bez zgłaszania wyjątku. –

+1

Narzędzie Fuslogvw.exe to lepsza pułapka na myszy, bez potrzeby włamywania się do rejestru. –

Powiązane problemy