Co oznacza wyjątek MissingManifestResourceException i jak go naprawić?

151

Sytuacja:

  • Mam bibliotekę klas o nazwie RT.Servers, zawierającą kilka zasobów (typubyte[] , ale nie sądzę, że to ważne)
  • Ta sama biblioteka klas zawiera metodę, która zwraca jeden z tych zasobów
  • Mam prosty program (z odniesieniem do tej biblioteki), który wywołuje tylko tę jedną metodę

Otrzymuję wiadomość MissingManifestResourceExceptionz następującą wiadomością:

Nie można znaleźć żadnych zasobów odpowiednich dla określonej kultury lub kultury neutralnej. Upewnij się, że plik „Servers.Resources.resources” został poprawnie osadzony lub połączony z zestawem „RT.Servers” w czasie kompilacji lub że wszystkie wymagane zestawy satelickie są wczytywalne i w pełni podpisane.

Nigdy nie bawiłem się kulturą ani podpisywaniem na zgromadzeniach, więc nie wiem, co się tutaj dzieje. Działa to również w innym projekcie, który używa tej samej biblioteki. Jakieś pomysły?

Timwi
źródło
2
Jest to jeden z najbardziej nieprzydatnych wyjątków w .NET. Uruchamia się w co najmniej 3 scenariuszach, które nie mają ze sobą nic wspólnego.
rr-
1
Przepraszamy, ale to sposób firmy Microsoft: usuń wszystko, a następnie dodaj ponownie . Działa dla zasobów, NUGET, referencji i parametrów połączenia. Jest wiele narzędzi, ale poświęcisz czas na pliki raw w niestandardowych przypadkach ...
maxkoryukov

Odpowiedzi:

238

Wszystko, co musiałem zrobić, aby rozwiązać ten problem, to kliknąć Resources.resxplik prawym przyciskiem myszy w Eksploratorze rozwiązań i kliknąć Uruchom narzędzie niestandardowe . Spowoduje to ponowne wygenerowanie automatycznie wygenerowanego plikuResources.Designer.cs pliku.

Jeśli plik .resx został dodany do projektu ręcznie, właściwość narzędzia niestandardowego pliku musi być ustawiona na „ResXFileCodeGenerator”.

Problem jest spowodowany niezgodnością przestrzeni nazw, która występuje, jeśli zmienisz „domyślną przestrzeń nazw” zestawu w ustawieniach projektu. (Zmieniłem to z (wcześniej) "Servers"na (teraz)"RT.Servers" .)

W automatycznie wygenerowanym kodzie w programie Resources.Designer.csznajduje się następujący kod:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

Dosłowny ciąg "Servers.Resources"musiał zostać zmieniony na "RT.Servers.Resources". Zrobiłem to ręcznie, ale uruchomienie niestandardowego narzędzia równie dobrze by to zrobiło.

Timwi
źródło
9
Zaoszczędziło mi to dużo czasu!
Eric
1
+1! W VS 2010 ciąg literału ResourceManager pokazany powyżej jest automatycznie aktualizowany do wartości domyślnej przestrzeni nazw we właściwościach projektu (karta Aplikacja), przynajmniej dla WinForms.
TrueWill
2
A jeśli nie masz pliku resources.resx?
popiół 9
@ ashes999: Czy zajrzałeś do folderu Właściwości? To miejsce, w którym zwykle jest przynajmniej w przypadku projektów C #.
RenniePet
Uruchomiłem ten sam problem. Plik .resx został dodany do projektu ręcznie, właściwość narzędzia niestandardowego pliku, który ustawiłem na „ResXFileCodeGenerator”. Następnie plik resx jest pierwszym, a później plik designer.vb później. Pierwszym plikiem jest Actully desinger i późniejszy plik resx. jak mogę to zrobić ...
Kavitha,
37

Właśnie dzisiaj napotkałem ten problem i znalazłem tę stronę pomocy i obsługi technicznej firmy Microsoft która faktycznie obejść problem.

Miałem kilku delegatów na górze mojego pliku, w globalnej przestrzeni nazw i nagle MissingManifestResourceExceptionpodczas uruchamiania programu otrzymywałem następującą linię:

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

Następnie przeniosłem delegatów do przestrzeni nazw, dostałem ten sam błąd. W końcu umieściłem delegatów w jedynej klasie w tym pliku i błąd zniknął, ale nie chciałem, aby delegaci znajdowali się w tej klasie lub przestrzeni nazw.

Potem natknąłem się na powyższy link, który powiedział

Aby rozwiązać ten problem, przenieś wszystkie inne definicje klas, tak aby pojawiały się po definicji klasy formularza.

Umieściłem delegatów (których nie uważałbym za „definicje klas”) na dole tego pliku, poza lokalną przestrzenią nazw, a program już ich nie otrzymywał MissingManifestResourceException. Co za irytujący błąd. Ale wydaje się, że jest to solidniejsze rozwiązanie niż modyfikowanie automatycznie generowanego kodu :)

Mark Rushakoff
źródło
Dziękuję za odpowiedź. Wygląda na to, że miałeś inny problem, który spowodował ten sam objaw. Nie miałem żadnych dodatkowych klas w moim kodzie, w rzeczywistości nie miałem nawet żadnych formularzy. Powinienem edytować moją poprzednią odpowiedź, ponieważ odkryłem, że tak naprawdę nie muszę modyfikować automatycznie wygenerowanego kodu. Mogłem po prostu ponownie uruchomić generator kodu i sam by się naprawił. Nie mam pojęcia, dlaczego proces kompilacji nie zrobił tego automatycznie.
Timwi,
7
Wystąpił błąd z powodu dodania klasy powyżej klasy Formularza w pliku Form1.cs (zgodnie z opisem w sekcji „Rozwiązanie” podanego linku). Dzięki!
Matt Smith,
Taki sam problem; nic innego nie działało, więc po prostu usunąłem linię: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); bo nie obchodzi mnie ikona w tej konkretnej formie :)
Gary Huckabone
To jest odpowiedź. Dziękuję Ci.
Sertan Pekel
Jeśli ktoś był zdezorientowany, miałem klasę o nazwie „StringExtensions” przed bitem „Form1” w Form1.cs, przeniosłem ją poniżej Form1 w form1.cs zamiast powyżej i zadziałało
Ma Dude
31

Napotkałem podobny problem i chociaż wiem, że to nie jest przyczyna OP, opublikuję to tutaj, aby jeśli ktoś inny napotkał ten problem w przyszłości, odpowiedź będzie dostępna.

Jeśli dodasz klasę przed klasą projektanta, otrzymasz MissingManifestResourceExceptionwyjątek w czasie wykonywania (brak błędu kompilacji lub ostrzeżenia), ponieważ

Visual Studio wymaga, aby projektanci używali pierwszej klasy w pliku.

Aby uzyskać (nieco) więcej informacji, zobacz ten post .

Motti
źródło
12
Dziękujemy za opublikowanie tej „odpowiedzi”. Mimo, że jest to „nie na temat” w odniesieniu do problemu PO, dobrym pomysłem było umieszczenie go tutaj. Poszukiwanie MissingManifestResourceException doprowadziło mnie do tego wątku, a Twoja odpowiedź była trafna w moim problemie.
RenniePet
16

Miałem ten sam problem, ale użycie polecenia Run Custom Tool zgodnie z sugestią Timwi nie pomogło w moim przypadku.

Jednak to prowadzi mnie w dobrym kierunku, ponieważ skończyło się w Properties w .resx pliku. Tutaj zauważyłem różnicę w stosunku do innego pliku resx , który nie powodował żadnych problemów.

W moim przypadku musiałem zmienić właściwość „Build Action” z „Resource” na „Embedded Resource”.

Z tego powodu przypuszczam, że miałem plik resx w bibliotece, która była używana z innej aplikacji. Moja aplikacja nie miała własnego pliku resx , więc musiała użyć tego z biblioteki - która jest dostępna tylko wtedy, gdy jest osadzona w bibliotece, a nie „samodzielna”.

BlaM
źródło
2
+1 dzięki, dwukrotnie sprawdziłem moje pliki zasobów, które również znajdują się w osobnej bibliotece, do której odwołują się inne aplikacje. Miałem ustawioną akcję kompilacji na zawartość i po zmianie jej na zasób osadzony wszystko działało dobrze. Głupie niedopatrzenie
Shan Plourde
1
Dzięki! To zadziałało dla mnie, gdy miałem kilka plików tekstowych zawierających treść do testowania lub niektóre reguły mapowania biznesowego. Zmiana z zawartości na zasób osadzony rozwiązała problem.
S. Baggy
12

Kiedy uruchomiłem w podobnym problemie, w Vs 2012 okazało się, że właściwość "Custom Tool Namespace" pliku resx była nieprawidłowa (w moim przypadku właściwie nie była ustawiona, więc wygenerowany kod wyszedł z tego wyjątku w czasie wykonywania) . Mój ostateczny zestaw właściwości dla pliku resx wyglądał mniej więcej tak:

  • Akcja tworzenia: zasób osadzony
  • Kopiuj do katalogu wyjściowego: nie kopiuj
  • Narzędzie niestandardowe: ResXFileCodeGenerator
  • Przestrzeń nazw narzędzi niestandardowych: My.Project.S.Proper.Namespace
Starnuto di topo
źródło
3

Zobacz również: MissingManifestResourceException podczas uruchamiania testów po skompilowaniu za pomocą programu MSBuild (.mresource ma ścieżkę w manifeście)

Powtarzam tutaj odpowiedź tylko dla kompletności:

Wydaje się, że dodanie LogicalName do pliku projektu rozwiązuje problem:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

czyli tak, aby wpis zasobu osadzonego w pliku projektu wyglądał następująco:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

Jest to szczegółowo opisane w: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Zauważ, że używamy pliku resx, ale błąd nadal występuje.

Aktualizacja: Wydaje się, że problem z zasobami (w tym XAML) jest związany ze ścieżkami wyjściowymi i używaniem ukośników do przodu lub do tyłu, jak opisano szczegółowo w: Dlaczego modyfikowanie katalogów wyjściowych projektu powoduje: IOException nie został obsłużony „Nie można zlokalizować zasobu„ app.xaml ” ”.

nietras
źródło
Po około ośmiu godzinach od debugowania tego problemu i dosłownie przeszukiwania wszystkich odpowiedzi github, SO i Google, to jest odpowiedź, która rozwiązała mój problem ... fwiw, mój problem zaczął się pojawiać po migracji z .Net 3.5 do 4.7.2.
Neville,
3

Napotkałem inną przyczynę tego problemu, która nie była związana z plikami resx. Miałem bibliotekę klas, w której AssemblyInfo.cs zawierało:

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

Zestaw nie zawiera żadnego kodu WPF, motywu ani słowników zasobów. Pozbyłem się wyjątku, usuwając atrybut ThemeInfo.

Nie dostałem tylko rzeczywistego wyjątku

Wyjątek pierwszej szansy typu „System.Resources.MissingManifestResourceException”.

Przeglądając szczegóły wyjątku, system żądał MyAssembly.g.resources

Mam nadzieję, że może to pomóc komuś innemu.

wielka stopa
źródło
2
Dziękuję Ci za to! Dokładnie taka poprawka, jakiej potrzebowałem! Dzieje się, gdy przypadkowo utworzysz projekt ViewModel jako bibliotekę Control.
Andrew Hanlon
Dziękuję Ci. To naprawiło to dla mnie.
Jamleck
2

Nie jestem pewien, czy to pomoże ludziom, ale ten zadziałał dla mnie:

Problem, który miałem, polegał na tym, że otrzymywałem następującą wiadomość:

Nie można znaleźć żadnych zasobów odpowiednich dla określonej kultury lub kultury neutralnej. Upewnij się, że „My.Resources.Resources.resources” zostało poprawnie osadzone lub połączone z zestawem „X” w czasie kompilacji lub że wszystkie wymagane zestawy satelickie są wczytywalne i w pełni podpisane ”

Próbowałem pobrać zasoby, które zostały osadzone w moim projekcie z innej biblioteki klas.

To, co zrobiłem, aby rozwiązać problem, to ustawienie modyfikatora dostępu w zakładce Projekt-> Właściwości-> Zasoby z „Wewnętrzne” (dostępne tylko w tej samej bibliotece klas) na „Publiczne” (dostępne z innej biblioteki klas)

W takim razie biegnij i voila, koniec z błędami ...

kodowanie to moje życie
źródło
2

Rozwiązanie podane przez BlaM również zadziałało.

Jestem użytkownikiem VS 2013. Po wykonaniu wielu poprawek, ale bez powodzenia, spróbowałem tego:

  1. Kliknij prawym przyciskiem myszy plik zasobów, jeden po drugim, w przypadku wielu plików.
  2. Upewnij się, że właściwość „Build Action” jest ustawiona na „Embedded Resource”.

Otóż ​​to! :)

Jiten
źródło
Potwierdzam to. Mam działający projekt, ale potrzebowałem osobno obsługiwać zespoły zasobów, więc spróbowałem zmienić „Zasób osadzony” na zwykły „Zasób” i otrzymałem wyjątek MissingResourceManifestException.
Mosca Pt
2

Miałem ten sam problem, ale w moim przypadku umieszczam klasę w kontrolce użytkownika, która jest powiązana z kontrolą użytkownika, jak ta

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

Rozwiązaniem było przeniesienie MyUserControlObjectklasy Usercontrol na koniec, w ten sposób

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

mam nadzieję, że to pomoże

Kowal
źródło
Porozmawiaj o kiepskim opisie błędu ... Dodałem klasę pomocniczą do pliku CS głównego formularza. Nigdy bym nie zgadł, że komunikat o błędzie będzie prowadził do tego. Dzięki!
Adam Lewis
1

Po przeniesieniu projektu z VS2005 do VS2010 był wyświetlany błąd MissingManifestResourceException. Nie mam żadnych innych klas zdefiniowanych w pliku zawierającym moją klasę Form. Miałem również poprawnie ustawioną nazwę pliku zasobów resx. Nie udało się.

Więc usunąłem pliki resx i ponownie je wygenerowałem. Teraz wszystko w porządku.

Winston
źródło
1

Ostatnio napotkałem ten sam problem, trochę się zmagałem, znalazłem ten temat, ale żadne odpowiedzi nie były dla mnie poprawne.

Mój problem polegał na tym, że kiedy usunąłem główne okno z mojego projektu WPF (nie ma ono głównego okna), zapomniałem usunąć StartupUriz App.xaml. Chyba wyjątek ten może się zdarzyć, jeśli masz błąd w StartupUri, więc w przypadku, gdy ktoś zmaga się z tym - sprawdź StartupUriin App.xaml.

Archeg
źródło
1

Niedawno natknąłem się na ten problem, w moim przypadku zrobiłem kilka rzeczy:

  1. Upewnij się, że przestrzenie nazw są spójne w pliku Designer.cs pliku resx

  2. Upewnij się, że domyślna przestrzeń nazw zestawu (kliknij prawym przyciskiem myszy projekt i wybierz opcję Właściwości) jest ustawiona tak samo jak przestrzeń nazw, w której znajduje się plik zasobów.

Po wykonaniu kroku 2 wyjątek zniknął.

szturmowiec
źródło
1

Miałem ten problem, gdy dodałem kolejną klasę w pliku tuż przed klasą pochodzącą z Form. Dodanie go po rozwiązaniu problemu.

franckspike
źródło
1

Ten sam błąd może również wystąpić podczas wstawiania nowej klasy do kodu źródłowego klasy formularza utworzonego przez projektanta.

Ta nowa klasa może zostać usunięta i umieszczona w innym pliku cs.

(Przynajmniej w moim przypadku to był problem ...)

István Nagy
źródło
0

Ponieważ prekompiluję moją aplikację internetową (używając funkcji publikowania VS2012). Otrzymałem powyższy błąd. Wypróbowałem wszystkie sugestie, ale dziwna zmiana „Build Action” na „Content” załatwiła sprawę!

Markive
źródło
0

W moim przypadku mam interfejs API sieci Web z zasobami i na jego podstawie tworzę pakiet NuGet. Kiedy używam tego nugetu w innych projektach, zdaję sobie sprawę, że kiedy żądam interfejsu API z zasobami, MissingManifestResourceExceptionpo pewnym czasie wyszukiwania otrzymuję informację, że pakiet nuget nie pakuje zasobów automatycznie. Jeśli chcesz korzystać z plików zasobów, musisz to zrobić ręcznie. Musisz więc dodać poniższe wiersze do pliku .nuspec: (Odwiedź https://github.com/NuGet/Home/issues/1482 )

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

Ale przed dodaniem plików musisz się upewnić, której wersji .net używasz.

dcy
źródło
0

Miałem z nowo utworzonym projektem F #. Rozwiązaniem było odznaczenie opcji „Użyj standardowych nazw zasobów” we właściwościach projektu -> Aplikacja -> Zasoby / Określ, jak będą zarządzane zasoby aplikacji. Jeśli nie widzisz pola wyboru, zaktualizuj program Visual Studio! Mam zainstalowany 15.6.7. W 15.3.2 tego pola wyboru nie ma.

KCT
źródło
0

Wystarczy wspomnieć. Jeśli używasz stałej lub literału, upewnij się, że odwołuje się do zasobu formularza ProjectName.Resources, a nie cpntain Resources.resx.

To może zaoszczędzić godzinę lub dwie.

Ziele
źródło
0

Napotkałem ten problem z zarządzanym projektem C ++ opartym na WinForms po zmianie nazwy globalnej przestrzeni nazw (nie ręcznie, ale za pomocą narzędzia Rename w VS2017).

Rozwiązanie jest proste, ale gdzie indziej nie wspomniano.

Musisz zmienić RootNamespacewpis w pliku vcxproj, aby pasował do przestrzeni nazw C ++.

AntonK
źródło
0

W moim przypadku była to literówka w Xaml okna otwartego z formularza Winforms:

Błędny: <Image Source="/Resources/WorkGreen.gif"/>

Poprawnie: <Image Source="../Resources/WorkGreen.gif"/> to może komuś pomóc

tretom
źródło
-3

Ze strony pomocy technicznej Microsoft :

Ten problem występuje, jeśli używasz zlokalizowanego zasobu, który istnieje w zestawie satelickim utworzonym przy użyciu pliku Resources, który ma niewłaściwą nazwę pliku. Ten problem zwykle występuje podczas ręcznego tworzenia zespołu satelickiego.

Aby obejść ten problem, należy określić nazwę pliku Resources podczas uruchamiania programu Resgen.exe. Podczas określania nazwy pliku zasobów, upewnij się, że nazwa pliku zaczyna się od nazwy przestrzeni nazw aplikacji. Na przykład uruchom następujące polecenie w wierszu polecenia programu Microsoft Visual Studio .NET, aby utworzyć plik .resources zawierający nazwę obszaru nazw aplikacji na początku nazwy pliku:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
TheVillageIdiot
źródło
1
Dziękuję za odpowiedź, ale nie wiem, co to jest ResGen.exe, nigdy go nie używałem i szczerze mówiąc nie chcę go używać, ponieważ nie próbuję używać niczego wymyślnego. Z pewnością musi istnieć sposób, aby to naprawić w programie Visual Studio? Na przykład, skoro mówisz, że zasób jest „zlokalizowany”, w jaki sposób mogę zadeklarować zasób jako niezlokalizowany? Dzięki jeszcze raz.
Timwi,