Apa yang dimaksud dengan MissingManifestResourceException dan bagaimana cara memperbaikinya?

151

Situasi:

  • Saya memiliki perpustakaan kelas, yang disebut RT.Servers, berisi beberapa sumber daya (tipebyte[] , tapi saya pikir itu tidak penting)
  • Pustaka kelas yang sama berisi metode yang mengembalikan salah satu sumber daya tersebut
  • Saya punya program sederhana (dengan referensi ke perpustakaan itu) yang hanya memanggil metode tunggal itu

Saya mendapat MissingManifestResourceExceptionpesan berikut:

Tidak dapat menemukan sumber daya yang sesuai untuk budaya yang ditentukan atau budaya netral. Pastikan "Server.Resources.resources" dimasukkan dengan benar atau ditautkan ke perakitan "RT.Servers" pada waktu kompilasi, atau bahwa semua rakitan satelit yang diperlukan dapat dimuat dan ditandatangani sepenuhnya.

Saya tidak pernah bermain-main dengan budaya, atau dengan penandatanganan majelis, jadi saya tidak tahu apa yang terjadi di sini. Juga, ini berfungsi di proyek lain yang menggunakan perpustakaan yang sama. Ada ide?

Timwi
sumber
2
Ini adalah salah satu pengecualian yang paling tidak membantu di .NET. Ini memicu setidaknya 3 skenario yang tidak memiliki kesamaan apa pun.
rr-
1
Maaf, ini adalah cara Microsoft: hapus semua, lalu tambahkan lagi . Bekerja untuk sumber daya, NUGET, referensi dan string koneksi. Ada banyak alat, tetapi Anda akan menghabiskan waktu untuk file mentah dalam kasus yang tidak biasa ...
maxkoryukov

Jawaban:

238

Yang perlu saya lakukan untuk memperbaiki masalah ini adalah klik kanan Resources.resxfile di Solution Explorer dan klik Run Custom Tool . Ini menghasilkan kembali Resources.Designer.csfile yang dibuat secara otomatis .

Jika file .resx ditambahkan ke proyek secara manual, properti Alat Kustom file harus diatur ke "ResXFileCodeGenerator".

Masalahnya adalah karena ketidakcocokan ruang nama, yang terjadi jika Anda mengubah "ruang nama default" perakitan dalam pengaturan proyek. (Saya mengubahnya dari (sebelumnya) "Servers"menjadi (sekarang)"RT.Servers" .)

Dalam kode yang dibuat secara otomatis di Resources.Designer.cs, ada kode berikut:

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;
    }
}

String literal "Servers.Resources"harus diubah menjadi "RT.Servers.Resources". Saya melakukan ini secara manual, tetapi menjalankan alat kustom sama baiknya melakukannya.

Timwi
sumber
9
Ini menghemat banyak waktu!
Eric
1
+1! Di VS 2010 string ResourceManager literal yang ditunjukkan di atas secara otomatis diperbarui ke nilai Default Namespace di properti proyek (tab Aplikasi), setidaknya untuk WinForms.
TrueWill
2
Bagaimana jika Anda tidak memiliki file resources.resx?
ashes999
@ ashes999: Sudahkah Anda mencari di folder Properties? Di situlah biasanya untuk proyek C # setidaknya.
RenniePet
saya telah menjalankan masalah yang sama. File .resx ditambahkan ke proyek secara manual, properti Custom Tool dari file yang saya atur ke "ResXFileCodeGenerator". lalu file resx adalah file designer.vb pertama dan kemudian. File desinger pertama adalah yang pertama dan nanti file .resx. bagaimana saya bisa membuatnya ....
Kavitha
37

Saya baru saja menemukan masalah ini hari ini, dan saya menemukan halaman Bantuan dan Dukungan Microsoft ini yang benar-benar mengatasi masalah tersebut.

Saya memiliki beberapa delegasi di bagian atas file saya, di namespace global, dan tiba-tiba saya mendapatkan MissingManifestResourceExceptionketika menjalankan program, pada baris ini:

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

Kemudian saya memindahkan delegasi ke namespace, mendapatkan kesalahan yang sama. Akhirnya saya menempatkan delegasi di satu-satunya kelas di file itu, dan kesalahan hilang, tetapi saya tidak ingin delegasi di kelas atau namespace itu.

Kemudian saya menemukan tautan di atas, yang mengatakan

Untuk mengatasi masalah ini, pindahkan semua definisi kelas lainnya sehingga mereka muncul setelah definisi kelas bentuk.

Saya menempatkan delegasi (yang saya tidak akan menganggap "definisi kelas") di bagian bawah file itu, di luar namespace lokal, dan program tidak mendapatkan MissingManifestResourceExceptionlagi. Benar-benar kesalahan yang menjengkelkan. Tapi, itu sepertinya solusi yang lebih kuat daripada memodifikasi kode yang dibuat secara otomatis :)

Mark Rushakoff
sumber
Terima kasih atas jawaban anda. Sepertinya Anda memiliki masalah berbeda yang menyebabkan gejala yang sama. Saya tidak memiliki kelas tambahan dalam kode saya, bahkan saya bahkan tidak memiliki formulir sama sekali. Saya harus mengedit jawaban saya sebelumnya karena ternyata saya tidak perlu memodifikasi kode yang dibuat secara otomatis. Saya bisa saja menjalankan kembali generator kode, dan itu akan diperbaiki sendiri. Tidak tahu mengapa proses pembuatan tidak melakukannya secara otomatis.
Timwi
7
Saya mendapat kesalahan karena menambahkan kelas di atas kelas Formulir di file Form1.cs (seperti yang dibahas di bagian "Penyelesaian" dari tautan yang Anda berikan). Terima kasih!
Matt Smith
Permasalahan yang sama; tidak ada yang berfungsi jadi saya hanya menghapus baris: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); Karena saya tidak peduli dengan ikon dalam bentuk khusus itu :)
Gary Huckabone
Itulah jawabannya. Terima kasih.
Sertan Pekel
Jika ada yang bingung saya punya kelas yang disebut "StringExtensions" sebelum "Form1" sedikit dari Form1.cs, saya memindahkannya di bawah Form1 di form1.cs bukannya di atas dan itu berhasil
Ma Dude
31

Saya telah mengalami masalah yang sama dan, meskipun saya tahu itu bukan penyebab OP, saya akan mempostingnya di sini sehingga jika orang lain menemukan masalah ini di masa depan jawaban akan tersedia.

Jika Anda menambahkan kelas sebelum kelas desainer, Anda akan mendapatkan MissingManifestResourceExceptionpengecualian saat runtime (tidak ada kesalahan waktu kompilasi atau peringatan) karena

Visual Studio mengharuskan desainer menggunakan kelas pertama dalam file.

Untuk (sedikit) informasi lebih lanjut lihat posting ini .

Motti
sumber
12
Terima kasih telah memposting "jawaban" ini. Meskipun itu "off topic" relatif terhadap masalah OP, itu ide yang bagus untuk mempostingnya di sini. Pencarian untuk MissingManifestResourceException mengarahkan saya ke utas ini, dan jawaban Anda tepat untuk masalah saya.
RenniePet
16

Saya memiliki masalah yang sama, tetapi menggunakan perintah Jalankan Alat Kustom seperti yang disarankan oleh Timwi tidak membantu dalam kasus saya.

Namun itu membawa saya ke arah yang benar, karena saya berakhir di Properties dari file .resx . Di sini saya melihat perbedaan pada file .resx lain yang tidak menyebabkan masalah.

Dalam kasus saya, saya harus mengubah properti "Build Action" dari "Resource" menjadi "Embedded Resource".

Tebakan terbaik saya karena alasannya adalah, bahwa saya memiliki .resx di perpustakaan yang digunakan dari aplikasi lain. Aplikasi saya tidak memiliki file .resx sendiri , sehingga harus menggunakan yang dari perpustakaan - yang hanya tersedia ketika itu tertanam di perpustakaan dan tidak "berdiri sendiri".

BlaM
sumber
2
Terima kasih +1, saya memeriksa ulang file sumber saya yang juga ada di perpustakaan terpisah yang direferensikan oleh aplikasi lain. Saya memiliki Build Action yang diatur ke Konten, dan setelah mengubahnya ke Sumber Daya Tertanam, semua bekerja dengan baik. Pengawasan konyol
Shan Plourde
1
Terima kasih! Ini berfungsi untuk saya di mana saya memiliki beberapa file teks yang berisi konten untuk pengujian, atau beberapa aturan pemetaan bisnis. Mengubah dari Konten ke Sumber Daya Tertanam memperbaiki masalah.
S. Baggy
12

Ketika saya menjalankan dalam masalah yang sama, di Vs 2012, ternyata properti "Custom Tool Namespace" dari file resx salah (dalam kasus saya, sebenarnya, itu tidak disetel, sehingga kode yang dihasilkan mengecek pengecualian ini saat runtime) . Set properti terakhir saya untuk file resx adalah seperti ini:

  • Bangun tindakan: Sumber Daya Tertanam
  • Salin ke Direktori Output: Jangan menyalin
  • Alat Kustom: ResXFileCodeGenerator
  • Custom Namespace Alat: My.Project.S.Proper.Namespace
Starnuto di topo
sumber
3

Juga lihat: MissingManifestResourceException saat menjalankan tes setelah membangun dengan MSBuild (.mresource memiliki path dalam manifes)

Saya ulangi jawabannya di sini hanya untuk kelengkapan:

Tampaknya menambahkan LogicalName ke file proyek memperbaikinya:

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

yaitu sehingga entri sumber daya yang tertanam dalam file proyek terlihat seperti ini:

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

Ini dirinci dalam: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Perhatikan bahwa kami menggunakan file .resx, tetapi bug tersebut tampaknya masih terjadi.

Pembaruan: Masalah dengan sumber daya (termasuk XAML) tampaknya terkait dengan jalur keluaran dan penggunaan garis miring ke depan atau ke belakang sebagaimana dirinci dalam: Mengapa mengubah direktori keluaran proyek menyebabkan: IOException tidak ditangani "Tidak dapat menemukan app sumber daya 'app.xaml' . "

nietras
sumber
Setelah sekitar delapan jam men-debug masalah ini, dan secara harfiah menelusuri setiap jawaban github, SO, dan Google, ini adalah jawaban yang memecahkan masalah saya ... pertama, masalah saya mulai terjadi setelah bermigrasi dari .Net 3.5 ke 4.7.2.
Neville
3

Saya mengalami penyebab berbeda dari masalah ini, yang tidak terkait dengan file resx. Saya punya perpustakaan kelas di mana AssemblyInfo.cs berisi yang berikut:

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

Majelis tidak mengandung kode WPF, tema, atau kamus Sumberdaya. Saya menyingkirkan pengecualian dengan menghapus atribut ThemeInfo.

Saya tidak mendapatkan pengecualian yang sebenarnya, hanya

Pengecualian kesempatan pertama dari tipe 'System.Resources.MissingManifestResourceException'.

Melihat detail pengecualian, sistem meminta MyAssembly.g.resources

Semoga ini bisa membantu orang lain.

kaki besar
sumber
2
Terima kasih untuk ini! Perbaikan yang saya butuhkan! Terjadi ketika Anda secara tidak sengaja membuat proyek ViewModel sebagai pustaka kontrol.
Andrew Hanlon
Terima kasih. Ini memperbaikinya untuk saya.
Jamleck
2

Tidak yakin itu akan membantu orang tetapi yang ini berhasil untuk saya:

Jadi masalah yang saya miliki adalah bahwa saya mendapatkan pesan berikut:

Tidak dapat menemukan sumber daya yang sesuai untuk budaya yang ditentukan atau budaya netral. Pastikan "My.Resources.Resources.resources" dimasukkan dengan benar atau ditautkan ke perakitan "X" pada waktu kompilasi, atau bahwa semua rakitan satelit yang diperlukan dapat dimuat dan ditandatangani sepenuhnya "

Saya mencoba untuk mendapatkan sumber daya yang tertanam dalam proyek saya dari perpustakaan kelas lain.

Apa yang saya lakukan untuk memperbaiki masalah adalah mengatur Access Modifier di tab Project-> Properties-> Resources dari "Internal" (hanya dapat diakses dalam perpustakaan kelas yang sama) menjadi "Publik" (dapat diakses dari perpustakaan kelas lain)

Kemudian jalankan dan jalankan, tidak ada lagi kesalahan untuk saya ...

codingismylife
sumber
2

Solusi yang diberikan oleh BlaM juga bekerja untuk saya.

Saya adalah Pengguna VS 2013. Setelah melalui banyak perbaikan tetapi tidak berhasil, saya mencoba ini:

  1. Klik kanan file sumber daya, satu per satu, untuk beberapa file.
  2. Pastikan, properti "Bangun Tindakan" diatur ke "Sumber Daya Tertanam".

Itu dia! :)

Jiten
sumber
Mengkonfirmasikan ini Saya memiliki proyek yang berjalan tetapi perlu mempertahankan majelis sumber daya secara terpisah, jadi coba beralih dari "Sumber Daya Tertanam" menjadi "Sumber Daya" dan akhirnya mendapatkan MissingResourceManifestException.
Mosca Pt
2

Saya memiliki masalah yang sama, tetapi dalam kasus saya saya menempatkan kelas di kontrol pengguna yang terkait dengan kontrol pengguna seperti ini

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

Solusinya adalah dengan memindahkan MyUserControlObjectke akhir kelas Usercontrol, seperti ini

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

saya harap ini membantu

Smith
sumber
Bicara tentang deskripsi kesalahan jelek ... Saya menambahkan kelas pembantu ke file CS formulir utama. Saya tidak akan pernah menduga pesan kesalahan akan menghubungkan kembali ke ini. Terima kasih!
Adam Lewis
1

Saya mendapatkan kesalahan MissingManifestResourceException setelah saya porting proyek saya dari VS2005 ke VS2010. Saya tidak memiliki kelas lain yang ditentukan dalam file yang berisi kelas Formulir saya. Dan saya juga mengatur Resx Resource File Name saya dengan benar. Tidak bekerja

Jadi saya hapus file resx dan dibuat ulang. Semuanya baik sekarang.

Winston
sumber
1

Baru-baru ini mengalami masalah yang sama, berjuang sedikit, menemukan topik ini tetapi tidak ada jawaban yang benar untuk saya.

Masalah saya adalah bahwa ketika saya dihapus jendela utama dari proyek WPF saya (tidak memiliki jendela utama), saya lupa untuk menghapus StartupUridari App.xaml. Saya kira pengecualian ini dapat terjadi jika Anda memiliki kesalahan dalam StartupUri, sehingga dalam kasus jika ada orang yang berjuang dengan ini - periksa StartupUridi App.xaml.

Archeg
sumber
1

Baru-baru ini menemukan masalah ini, dalam kasus saya, saya melakukan beberapa hal:

  1. Pastikan ruang nama konsisten dalam file Designer.cs dari file resx

  2. Pastikan namespace default Majelis (klik kanan proyek dan pilih Properties) disetel sama dengan namespace file sumber daya.

Begitu saya melakukan langkah 2, pengecualian hilang.

stormtrooper
sumber
1

Saya punya masalah ini ketika saya menambahkan kelas lain di file tepat sebelum kelas yang berasal dari Formulir. Menambahkannya setelah memperbaiki masalah.

franckspike
sumber
1

Juga kesalahan yang sama dapat terjadi ketika Anda menempatkan kelas baru ke dalam kode sumber kelas bentuk yang dibuat perancang.

Kelas baru ini dapat dihapus, dan ditempatkan di file cs yang berbeda.

(Setidaknya dalam kasusku ini masalahnya ...)

István Nagy
sumber
0

Karena saya melakukan pra-kompilasi aplikasi web saya (menggunakan fitur VS2012 publish). Saya mendapatkan kesalahan di atas. Saya mencoba semua saran, tetapi anehnya mengubah 'Bangun Tindakan' menjadi 'Konten' berhasil!

Ditandai
sumber
0

Dalam kasus saya, saya memiliki web api dengan sumber daya dan saya membuat paket nuget dari itu. Ketika saya menggunakan nuget ini di proyek lain, saya menyadari bahwa ketika saya meminta api dengan sumber daya, saya mendapatkan MissingManifestResourceExceptionsetelah sedikit riset, saya belajar nuget packager tidak mengemas sumber daya secara otomatis. Jika Anda ingin menggunakan file sumber daya, Anda harus melakukannya secara manual. Jadi, Anda perlu menambahkan baris di bawah ini ke file .nuspec Anda: (Kunjungi 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>

Tapi, sebelum menambahkan file, Anda harus memastikan versi .net yang Anda gunakan.

dcy
sumber
0

Saya memiliki proyek F # yang baru dibuat. Solusinya adalah dengan menghapus centang "Gunakan nama sumber daya standar" di properti proyek -> Aplikasi -> Sumber Daya / Tentukan bagaimana sumber daya aplikasi akan dikelola. Jika Anda tidak melihat kotak centang maka perbarui Visual Studio Anda! Saya sudah menginstal 15.6.7. Di 15.3.2 kotak centang ini tidak ada.

KCT
sumber
0

Hanya untuk menyebutkan. Jika Anda menggunakan konstanta atau literal, pastikan itu merujuk pada sumber daya formulir ProjectName.Resources, dan tidak dapat diperoleh Resources.resx.

Itu bisa menghemat satu atau dua jam.

Herba
sumber
0

Saya mengalami masalah dengan proyek C ++ terkelola berdasarkan WinForms setelah mengubah nama namespace global (tidak secara manual, tetapi dengan alat Rename VS2017).

Solusinya sederhana, tetapi tidak disebutkan di tempat lain.

Anda harus mengubah RootNamespaceentri dalam file vcxproj agar sesuai dengan namespace C ++.

AntonK
sumber
0

Dalam kasus saya itu adalah salah ketik di Xaml dari jendela yang dibuka dari Formulir Winforms:

Salah: <Image Source="/Resources/WorkGreen.gif"/>

Benar: <Image Source="../Resources/WorkGreen.gif"/> Ini dapat membantu seseorang

tretom
sumber
-3

Dari halaman dukungan Microsoft :

Masalah ini terjadi jika Anda menggunakan sumber daya terlokalisasi yang ada di perakitan satelit yang Anda buat dengan menggunakan file .resources yang memiliki nama file yang tidak pantas. Masalah ini biasanya terjadi jika Anda membuat perakitan satelit secara manual.

Untuk mengatasi masalah ini, tentukan nama file dari file .resources ketika Anda menjalankan Resgen.exe. Saat Anda menentukan nama file dari file .resources, pastikan bahwa nama file dimulai dengan nama namespace dari aplikasi Anda. Misalnya, jalankan perintah berikut di Microsoft Visual Studio .NET command prompt untuk membuat file .resources yang memiliki nama namespace dari aplikasi Anda di awal nama file:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
TheVillageIdiot
sumber
1
Terima kasih atas tanggapan Anda, tetapi saya tidak tahu apa itu ResGen.exe, saya tidak pernah menggunakannya, dan terus terang saya tidak ingin menggunakannya karena saya tidak mencoba menggunakan sesuatu yang mewah. Tentunya harus ada cara untuk memperbaikinya dari Visual Studio? Misalnya, karena Anda mengatakan sumber daya "terlokalisasi", bagaimana cara menyatakan sumber daya sebagai non-lokal? Terima kasih lagi.
Timwi