Mam dwa projekty sieciowe ASP.NET (ProjectA i ProjectB). Gdy klasa w ProjectA tworzy instancję klasy ProjectB, która korzysta z pliku zasobów Blah.resx, pojawia się ten błąd:
Wyjątek typu „System.Resources.MissingManifestResourceException” wystąpił w pliku mscorlib.dll, ale nie został obsłużony w kodzie użytkownika.
Nie można znaleźć żadnych zasobów odpowiednich dla określonej kultury lub kultury neutralnej. Upewnij się, że „Resources.Blah.resources” zostało poprawnie osadzone lub połączone w zestawie „App_GlobalResources.sn_flri6” w czasie kompilacji, lub że wszystkie wymagane zestawy satelitów są wczytywalne i w pełni podpisane.
Co to powoduje?
W witrynie firmy Microsoft znajduje się artykuł na temat tego http://support.microsoft.com/kb/318603, który sugeruje:
Aby rozwiązać ten problem, przenieś wszystkie pozostałe definicje klas, aby pojawiły się po definicji klasy formularza.
Jest to rozwiązanie dla projektu Windows Forms, nie jestem pewien, czy dotyczy to również projektów internetowych.
źródło
To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.
To rozwiązało mój problem.GetGlobalResourceObject
Odpowiedzi:
Właśnie trafiłem na ten sam wyjątek w projekcie WPF. Problem wystąpił w zestawie, który niedawno przenieśliśmy do innej przestrzeni nazw (
ProblemAssembly.Support
doProblemAssembly.Controls
). Wystąpił wyjątek podczas próby uzyskania dostępu do zasobów z drugiego pliku zasobów, który istnieje w zestawie.Okazuje się, że dodatkowy plik zasobów nie przeniósł poprawnie odniesień ze starej nazwy przestrzeni nazw do nowej nazwy przestrzeni nazw.
W pliku designer.cs dla pliku zasobów znajduje się właściwość statyczna umożliwiająca pobranie menedżera zasobów. W obrębie tego gettera ciąg nadal odwoływał się do starej przestrzeni nazw. Po poprawieniu go do nowej przestrzeni nazw problem został rozwiązany:
powinien był być:
Mam nadzieję, że to pomoże następnej osobie.
źródło
Rozwiązałem problem w ten sposób:
Działa idealnie.
źródło
Kiedy próbowałem udostępnić plik resource.resx z jednego projektu C # z innym projektem C #, dostałem ten problem. Sugestia przeniesienia klasy Form na początek jej pliku była nieodpowiednia. Tak to rozwiązałem. Zasadniczo używasz łącza z drugiego projektu do pierwszego, a następnie włączasz regenerację
resource.designer.cs
pliku.Properties/Resources.resx
plik drugiego projektuProperties/Resources.resx
plik pierwszego projektu jako LINK do folderu Właściwości w drugim projekcie. Nie dodawaj go do poziomu głównego projektu.Properties/Resources.designer.cs
!Resources.resx
dodajResXFileCodeGenerator
jako CustomToolResources.resx
i wybierz „Uruchom narzędzie niestandardowe”. Spowoduje to wygenerowanie nowego pliku designer.cs.Uwaga: unikałbym edytowania pliku resource.designer.cs, ponieważ jest on generowany automatycznie.
źródło
W moim przypadku seria źle pomyślanych globalnych zamienników tekstu nieumyślnie zmieniła ten wiersz w pliku cs projektanta zasobów.
Ponieważ przestrzeń nazw w tym argumencie nie była już zgodna z przestrzenią nazw klasy, aplikacja uległa dezorientacji w czasie wykonywania.
Sprawdź, czy przestrzeń nazw projektanta jest zgodna z argumentem ciągu w tym wierszu.
źródło
Dzieje się tak, ponieważ
*.resх
wykluczone z migracji.źródło
Odkryłem, że usunięcie pliku designer.cs, z wyłączeniem pliku resx z projektu, a następnie ponowne włączenie go często rozwiązało ten problem, po refaktoryzacji przestrzeni nazw (zgodnie z odpowiedzią CFinck)
źródło
Wydaje się, że nikt nie wspomniał o tym rozwiązaniu. Oczywiste, naprawdę - ale potknąłem się na chwilę ...
Domyślny modyfikator dostępu dla nowego pliku zasobów to
Internal
(lubFriend
w VB.Net.) Upewnij się, że zmieniłeś to naPublic
(w projektancie resx znajduje się menu rozwijane u góry dla modyfikatora dostępu)
źródło
Sama odpowiedź Sibi Elangos nie była dla mnie wystarczająca, więc musiałem
Spowoduje to wygenerowanie App_GlobalResources w twoim
/bin
folderze, teraz skopiuj ten folder również do katalogu głównego aplikacji internetowejźródło
W moim przypadku problem spowodowany niewłaściwym zdefiniowaniem klasy:
Po ponownym przydzieleniu
BackendObject
do końca (lepiej oddzielić plik), wykonanie projektu czystego + przebudowanie rozwiązało problem.źródło
Rozwiązałem ten problem, przechodząc do projektu, w którym został zapisany mój plik zasobów, przewijając w dół do jego grupy przedmiotów i dodając logiczną nazwę odpowiadającą ścieżce oczekiwanej przez kompilator.
Mój EmbeddedResource wyglądał tak:
Teraz wygląda to tak
źródło
W tym przypadku sprawdź, czy zestaw zawierający zasoby ma domyślną przestrzeń nazw ustawioną na ten sam tekst (Projekt-> Właściwości-> Domyślna przestrzeń nazw; w VS) Sprawdź również, czy plik resx ma właściwość BuildAction ustawioną na „Osadzony” zasób „Ciesz się ...;)
źródło
Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
Jednym z podejść byłoby umieszczenie wspólnych klas / zasobów w osobnym projekcie biblioteki klas i skierowanie ich na obie strony internetowe.
źródło
Dzięki @CFinck! Aby dodać wskazówkę do innych: zmieniłem linię ResourceManager w ten sposób:
Jestem w vb.net, ale myślę, że w C # jedyną różnicą byłoby + zamiast & by połączyć łańcuchy.
W ten sposób mogę używać tych samych połączonych plików zespołów w dwóch podobnych projektach, które współużytkują zasoby.
źródło
Ten błąd jest również zgłaszany przez Dotfuscation, ponieważ plik projektanta resx opiera się na odbiciu. Jeśli używasz Dotfuscatora, spowoduje to uszkodzenie plików resx. Zawsze musisz dodać je jako wykluczenie z procesu zaciemniania.
źródło
Kiedy korzystaliśmy
Generowałby ten błąd, chyba że zawiniemy to wywołanie w instrukcji try / catch.
źródło
Mam aplikację WinForms z jednym projektem w rozwiązaniu.
Kierowanie
.NET Framework 4.0
Korzystanie
SharpDevelop 4.3
jak moja IDEBrzmi głupio, ale zdarzyło mi się mieć
Logical Name
właściwość ustawioną"Resources"
w moim"Resources.resx"
pliku. Po wyczyszczeniu tej nieruchomości wszystko działa jak przystojniak.Zwykle, gdy dodajesz losowe pliki jako
EmbeddedResource
, zazwyczaj chcesz ustawićLogical Name
coś rozsądnego, z jakiegoś powodu zrobiłem to samo dlaResources.resx
pliku i to wszystko spieprzyło ...Mam nadzieję, że to komuś pomoże.
źródło
Dla mnie problemem było kopiowanie plików .resx i powiązanych plików .cs z jednego projektu do drugiego. Oba projekty miały tę samą przestrzeń nazw, więc to nie był problem.
Wreszcie rozwiązałem problem, gdy zauważyłem w Solution Explorer, że w oryginalnym projekcie pliki .resx były zależne od plików .cs:
W skopiowanym projekcie pliki .cs były zależne od plików .resx:
Okazało się, że w drugim projekcie w jakiś sposób pliki .resx zostały ustawione na automatyczne generowanie plików .cs. Automatycznie wygenerowane pliki .cs zastępowały pliki .cs skopiowane z oryginalnego projektu.
Aby rozwiązać problem, edytuj właściwości każdego pliku .resx w skopiowanym projekcie. Właściwość Custom Tool zostanie ustawiona na coś takiego jak ResXFileCodeGenerator . Wyczyść właściwość Custom Tool pliku .resx. Konieczne będzie ponowne skopiowanie pliku .cs z oryginalnego projektu, ponieważ zostanie on zastąpiony automatycznie wygenerowanym plikiem.
źródło
W moim przypadku umieściłem nową klasę na formularzu Windows w tym samym pliku.
Usunięcie nowo dodanej klasy z tego pliku rozwiązało problem.
Zobacz tutaj: http://i.stack.imgur.com/wVu6c.png
źródło
Może to być spowodowane niedopasowanymi przestrzeniami nazw. Druga odpowiedź od góry (Sibi Elango) mówi, aby kliknąć prawym przyciskiem myszy plik resx i zmienić opcję kompilacji na EmbeddedResource, ale już to zrobiłem i nadal miałem błąd. Najlepsza odpowiedź (CFinck's) wskazuje na sposób naprawienia tego poprzez ręczną edycję plików, miałem jednak ten problem w MonoDevelop i musiałem ustawić domyślną przestrzeń nazw na taką samą jak plik cs, który wzywał do zasobu (plik, który zawierał kod, taki jak kod poniżej) ...
Po ustawieniu domyślnej przestrzeni nazw za pomocą GUI powyższy wiersz nie powodował już wyjątku.
źródło
Po prostu inna sprawa. Skopiowałem rozwiązanie z dwoma projektami i nazwałem je częściowo w Eksploratorze Windows (nazwy folderów, nazwy plików .sln i .csproj), a częściowo za pomocą ogromnej akcji Znajdź i zamień w Visual Studio (przestrzenie nazw itp.). Niemniej jednak wyjątek określony przez PO nadal występował. Dowiedziałem się, że nazwy Zgromadzenia i Przestrzeni Nazw były wciąż stare.
Chociaż projekt i wszystko inne zostało już nazwane OfficeStyle
Assembly name
iDefault namespace
wciąż nazwany Linckus .Po tej korekcie wszystko znów działało dobrze, skompiluj i uruchom :)
źródło
W moim przypadku te wiersze kodu bardzo mi
Web.config
pomogły:Wraz z działaniem produkcji:
Embedded Resource
i niestandardowe narzędzia:PublicResXFileCodeGenerator
.źródło
Właściwości podwójnego kliknięcia w sekcji Aplikacja sprawdź Nazwa zestawu i domyślna przestrzeń nazw są takie same
źródło
Miałem również do czynienia z tym samym problemem, wypróbowałem wszystkie rozwiązania wymienione w odpowiedzi, ale żadne nie wydawało się działać. Okazało się, że podczas odprawy kodu do TFS. TFS nie rejestrował pliku Resx, tylko sprawdzał w pliku projektanta. Tak więc wszyscy inni programiści mieli do czynienia z tym problemem podczas pracy na swoich komputerach. Ręczne sprawdzenie pliku resx załatwiło sprawę
źródło
Może się to również zdarzyć, gdy umieścisz klasę nad główną klasą winform (na przykład Form1). Możesz to zobaczyć, patrząc na projekt, ponieważ nie jest on renderowany.
źródło
Jeszcze jedna przyczyna: jeśli twoja przestrzeń nazw zawiera myślnik („-”), to zbuduje się i uruchomi poprawnie, ale zasób nie będzie dostępny. Przestrzenie nazw (identyfikatory) nie powinny mieć łączników, ale wydaje się, że nie jest to egzekwowane nigdzie poza ładowaniem zasobów. Spaliło mnie to dwukrotnie w ciągu dekady.
źródło
Inną sprawą do sprawdzenia jest to, czy w EmbeddedResource zdefiniowano LogicalName lub ManifestResourceName. Upewnij się, że są one odpowiednio zdefiniowane, jeśli plik projektu ich używa, ponieważ mogą spowodować, że zasoby będą działały pod nazwą, której się nie spodziewasz.
źródło
Napotkałem ten problem podczas uruchamiania polecenia migracji.
Update-Database
w konsoli Menedżera pakietów.Zaakceptowana odpowiedź nie rozwiązała mojego problemu.
Musiałem zmienić Build Action z
Compile
naEmbedded Resource
i to zadziałało dla mnie.Możesz zrobić to samo, wykonując poniższe czynności:
źródło
Dla użytkowników, którzy napotykają ten problem w .NET Core 3.0, może to być związane z przełomową zmianą, która dokonała się w .NET Core 3.0, aby rozwiązać ten problem, po prostu ustaw
EmbeddedResourceUseDependentUponConvention
na false w swoim projekcie csproj:źródło
Kliknij zasoby prawym przyciskiem myszy i wybierz
Run Custom Tool
To naprawi projektanta
źródło
To, że odwołujesz się do biblioteki DLL projektu B, nie oznacza, że Menedżer zasobów projektu A zna katalog App_GlobalResources projektu B.
Czy korzystasz z projektów witryn internetowych lub projektów aplikacji internetowych? W drugim przypadku program Visual Studio powinien umożliwiać łączenie plików kodu źródłowego (nie jestem pewien co do tego pierwszego, nigdy ich nie użyłem). Jest to mało znana, ale przydatna funkcja, którą opisano tutaj . W ten sposób możesz połączyć pliki zasobów Projektu B z Projektem A.
źródło