Tidak dapat menemukan sumber daya yang sesuai untuk budaya yang ditentukan atau budaya netral

194

Saya memiliki dua proyek Web ASP.NET (ProjectA dan ProjectB). Ketika kelas di ProjectA adalah instantiating kelas ProjectB yang menggunakan file sumber daya Blah.resx, saya mendapatkan kesalahan ini:

Pengecualian dari tipe 'System.Resources.MissingManifestResourceException' terjadi di mscorlib.dll tetapi tidak ditangani dalam kode pengguna.

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

Apa yang menyebabkan ini?

Ada artikel di situs Microsoft tentang http://support.microsoft.com/kb/318603 ini yang menyarankan:

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

Ini adalah solusi untuk proyek Windows Forms, saya tidak yakin apakah itu juga berlaku untuk proyek Web.

dev.e.loper
sumber
Jenis proyek apa ini? 2 situs web? 1 situs web, 1 perpustakaan kelas?
Ruddy
Dua Proyek Situs Web ASP.NET.
dev.e.loper
11
+1 untuk To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.Ini menyelesaikan masalah saya.
OmarOthman
1
Beri +1 definisi pertanyaan Anda dengan tautan Bantuan Proyek Microsoft Windows.Forms baru saja menyelesaikan masalah saya.
DarrenMB
Jawaban ini memecahkan masalah bagi saya! GetGlobalResourceObject
DanielV

Jawaban:

257

Saya baru saja mencapai pengecualian yang sama dalam proyek WPF. Masalah terjadi dalam majelis yang baru-baru ini kami pindah ke namespace lain ( ProblemAssembly.Supportke ProblemAssembly.Controls). Pengecualian terjadi ketika mencoba mengakses sumber daya dari file sumber daya kedua yang ada di majelis.

Ternyata file sumber daya tambahan tidak memindahkan referensi dari nama namespace lama ke nama namespace baru.

Di designer.cs untuk file sumber daya, ada properti statis untuk mendapatkan ResourceManager. Di dalam pengambil itu, string masih merujuk namespace lama. Setelah dikoreksi ke namespace baru, masalahnya teratasi:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

seharusnya:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);

Semoga ini bisa membantu orang selanjutnya.

CFinck
sumber
5
+1 Penjelasan yang baik tentang tempat mencari penyebab dalam file desainer. Menemukan dan memperbaiki masalah yang sama, terima kasih :)
Lewat Coding
1
tautan: Dokumentasi MSDN untuk kelas ResourceManager .
Boinst
3
Terima kasih itu membantu saya menyelesaikan masalah ini. Satu juga dapat menghapus file desainer, lalu buka kemudian simpan file resx untuk membuat ulang file desainer dengan benar.
Serge
1
Saya memiliki masalah yang sama dan ini adalah jawaban yang saya cari. Sayangnya itu tidak muncul pada waktu kompilasi :-( Terima kasih
noob
2
terima kasih punya masalah ini juga tetapi itu karena saya menambahkan subfolder dengan nama yang sama dengan bagian terakhir dari namespace proyek sehingga ia mencari project.folder.folder.class bukan project.folder.class. Saya memindahkannya ke root dan sekarang berbaris dan berfungsi!
SelAromDotNet
115

Saya memecahkan masalah seperti ini:

  1. Klik kanan pada ResourceFile Anda
  2. Ubah kompilasi properti "Build Action" menjadi "Embedded Resource"
  3. Kemudian bangun dan jalankan

Ini bekerja dengan sempurna.

Sibi Elango
sumber
@sibi Elango Saya klik kanan pada ResourceFile saya tetapi tidak dapat menemukan bagian Build Action.
S5498658
1
@ S5498658 Jika Anda tidak melihat ini di menu konteks (klik kanan), lihat di panel Properties (biasanya terletak di bawah explorer solusi).
mendefinisikan
Ini membangun aksi tetapi masih tidak berfungsi. Saya juga memeriksa direktori dan direktori di bawah properti yang sama.
Albatross
1
Alangkah baiknya jika jawabannya menjelaskan mengapa solusi ini berhasil.
Luis Teijon
ini luar biasa
code4j
22

Ketika saya mencoba berbagi file resource.resx dari satu proyek C # dengan proyek C # lainnya, saya mendapatkan masalah ini. Saran tentang memindahkan kelas Formulir ke awal file tidak tepat. Ini adalah bagaimana saya menyelesaikannya. Anda pada dasarnya menggunakan tautan dari proyek kedua ke yang pertama, lalu mengaktifkan regenerasi resource.designer.csfile.

  1. Hapus Properties/Resources.resxfile proyek kedua
  2. Tambahkan Properties/Resources.resxfile proyek pertama sebagai LINK ke folder Properties di proyek kedua. Jangan menambahkannya ke level root proyek.
  3. Jangan tambahkan proyek pertama Properties/Resources.designer.cs!
  4. Pada properti proyek kedua Resources.resx, tambahkan ResXFileCodeGeneratorsebagai CustomTool
  5. Klik kanan pada Resources.resxdan pilih "Run Custom Tool". Ini akan menghasilkan file designer.cs baru.

Catatan: Saya akan menghindari mengedit file resource.designer.cs, karena ini dibuat secara otomatis.

Mark Lakata
sumber
12

Dalam kasus saya, serangkaian penggantian teks global yang dipikirkan secara buruk telah secara tidak sengaja mengubah baris ini dalam file cs perancang sumber daya.

masukkan deskripsi gambar di sini

Karena namespace dalam argumen itu tidak cocok dengan namespace kelas lagi, aplikasi menjadi bingung pada saat run time.

Periksa apakah namespace dari perancang cocok dengan argumen string di baris itu.

cockypup
sumber
1
Persis masalah saya. Terima kasih telah berbagi!
AcidJunkie
Sama di sini: itu terjadi setelah bermigrasi dari PCL ke .NET Standard, ketika saya membuat proyek sementara dan namespace, di mana saya menyalin semua file portabel, menghapus proyek portabel dan mengembalikan namespace kembali ke aslinya, baris ini masih berisi sementara namespace dari proses migrasi.
Zerga
11

Itu terjadi karena *.resхdikecualikan dari migrasi.

  • Klik kanan pada ResourceFile Anda
  • Klik pada item menu "Termasuk dalam proyek"
pengguna1919359
sumber
2
Ini memperbaikinya untuk saya. Biasanya file resx ditambahkan secara otomatis. Saya melakukan penggabungan di mana saya harus mengubah file proyek dan menambahkan migrasi secara manual, jadi mungkin itu ada hubungannya dengan itu
smarty
Bekerja untukku. Saya harus menambahkan semua file * .resx dari setiap migrasi. Terima kasih
m.rufca
7

Saya menemukan bahwa menghapus file designer.cs, tidak termasuk file resx dari proyek dan kemudian memasukkannya kembali sering memperbaiki masalah ini, mengikuti refactoring namespace (sesuai jawaban CFinck)

Stephen Drew
sumber
Inilah yang melakukannya untuk saya! (mencoba jawaban CFinck karena tampaknya relevan, tetapi tidak berhasil)
dimenangkan
Memang salah satu solusi tercepat
Lorenz Lo Sauer
6

Sepertinya tidak ada yang menyebutkan solusi ini. Jelas sekali - tetapi membuat saya tersandung sejenak ...

Pengubah akses default untuk file sumber daya baru adalah Internal(atau Frienddalam VB.Net.) Pastikan Anda mengubahnya kePublic

(pada perancang resx ada dropdown di bagian atas untuk pengubah akses)

James S
sumber
4

Sibi Elangos menjawab sendiri tidak cukup untuk saya, jadi saya harus melakukannya

  • Klik kanan pada ResourceFile Anda
  • Ubah properti "Bangun Tindakan"
  • Kompilasi ke "Sumberdaya Tertanam"
  • Bangun dan gunakan

Ini akan menghasilkan App_GlobalResources di /binfolder Anda , sekarang salin folder itu juga ke root aplikasi web

AlexanderD
sumber
4

Dalam kasus saya, masalah yang disebabkan oleh mendefinisikan kelas dengan cara yang salah:

namespace MyBuggyWorld
{
    public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
    {
        public TcpClient ActiveClient { get; set; }
        public BackgroundWorker ActiveWorker { get; set; }
    }
    public partial class FormMain : Form
    {
    }
}

Setelah Reallocating BackendObjecthingga akhir (lebih baik memisahkan file), melakukan project clean + membangun kembali menyelesaikan masalah.

Jawad Al Shaikh
sumber
1
Wow, saya tidak sadar bahwa memiliki kelas yang salah pada awal file akan merusak segalanya.
BrainStorm.exe
4

Saya menyelesaikan ini dengan pergi ke proyek di mana file sumber daya saya disimpan, gulir ke bawah ke ItemGroup dan menambahkan nama logis yang sesuai dengan jalur yang diharapkan oleh kompiler.

EmbeddedResource saya terlihat seperti ini:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

Sekarang terlihat seperti ini

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
Juansero29
sumber
3

Sejauh menyangkut kasus ini periksa apakah majelis yang mengandung sumber daya memiliki namespace default yang disetel ke teks yang sama (Project-> Properties-> Default namespace; dalam VS) Periksa juga apakah file resx memiliki properti BuildAction yang disetel ke "Embedded sumber daya "Nikmati ...;)

Mohammad Fazeli
sumber
1
Hai, maksud Anda apakah teks namespace (xxx) default harus sama dengan dalam kode: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV
2

Salah satu pendekatan akan menempatkan kelas / sumber daya bersama dalam proyek perpustakaan kelas yang terpisah dan merujuk mereka di kedua situs web.

Subbu
sumber
2
Tentunya ini adalah masalah yang sama, bukan?
Brett Rigby
2

Terima kasih @CFinck! Hanya untuk menambahkan tip ke orang lain: Saya mengubah baris ResourceManager dengan ini:

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

Saya di vb.net tapi saya pikir di C # satu-satunya perbedaan adalah + bukannya & untuk merangkai string.

Dengan cara ini saya dapat menggunakan file rakitan tertaut yang sama di dua proyek serupa yang berbagi sumber daya.

Mathieu Leblanc
sumber
1

Kesalahan ini juga dimunculkan oleh Dotfuscation, karena file resx designer bergantung pada refleksi. Jika Anda menggunakan Dotfuscator, itu akan merusak file resx Anda. Anda harus selalu menambahkannya sebagai pengecualian dari proses kebingungan.

Trevor Elliott
sumber
1

Ketika kami menggunakan

HttpContext.GetGlobalResourceObject()

Itu akan menghasilkan kesalahan itu kecuali kami membungkus panggilan itu di dalam pernyataan coba-coba.

jmb_coder
sumber
1

Saya memiliki aplikasi WinForms dengan satu proyek dalam solusinya.
Penargetan .NET Framework 4.0
Menggunakan SharpDevelop 4.3sebagai IDE saya

Kedengarannya konyol, tetapi kebetulan saya memiliki Logical Nameproperti diatur "Resources"pada "Resources.resx"file saya . Setelah saya membersihkan properti itu, semua berfungsi keren-dory.

Biasanya, ketika Anda menambahkan file acak EmbeddedResource, Anda biasanya ingin mengatur Logical Nameke sesuatu yang masuk akal, untuk beberapa alasan, saya melakukan hal yang sama padaResources.resx file tersebut dan itu mengacaukan semuanya ...

Semoga ini bisa membantu seseorang.

nurchi
sumber
Sepertinya aku juga punya ini. Konflik penamaan kurasa, temukan bagus!
Trent
1

Bagi saya masalahnya adalah menyalin file .resx dan file .cs terkait dari satu proyek ke proyek lain. Kedua proyek memiliki namespace yang sama sehingga bukan masalahnya.

Akhirnya dipecahkan ketika saya perhatikan di Solution Explorer bahwa dalam proyek asli file .resx bergantung pada file .cs:

MyResource.cs
|_ MyResource.resx

Saat dalam proyek yang disalin, file .cs bergantung pada file .resx:

MyResource.resx
|_ MyResource.cs

Ternyata dalam proyek kedua entah bagaimana file .resx telah diatur untuk menghasilkan file .cs secara otomatis. File .cs yang dibuat secara otomatis menimpa file .cs yang disalin dari proyek asli.

Untuk memperbaiki masalah, edit properti masing-masing file .resx dalam proyek yang disalin. The Kustom Alat properti akan ditetapkan ke sesuatu seperti ResXFileCodeGenerator . Bersihkan properti Alat Kustom file .resx. Anda perlu menyalin kembali file .cs dari proyek asli karena akan ditimpa oleh file yang dibuat secara otomatis.

Simon Tewsi
sumber
1

Dalam kasus saya, saya telah menempatkan kelas baru di atas formulir Windows, dalam file yang sama.

Memindahkan kelas yang baru ditambahkan dari file itu memperbaiki masalah.

Lihat di sini: http://i.stack.imgur.com/wVu6c.png

Petre
sumber
1
Selamat datang di Stackoverflow! Jika Anda memiliki kode untuk dibagikan kepada kami, jangan posting sebagai gambar. Anda dapat menambahkannya ke posting Anda dan memformatnya sebagai kode .
FelixSFD
Terima kasih @FelixSFD untuk sarannya
Petre
1

Ini dapat disebabkan oleh ruang nama yang tidak cocok. Jawaban kedua dari atas (Sibi Elango) mengatakan untuk mengklik kanan file resx, dan mengubah opsi Build ke EmbeddedResource, tetapi saya sudah melakukan itu dan masih memiliki kesalahan. Jawaban teratas (CFinck) mencatat cara untuk memperbaikinya melalui pengeditan file secara manual, namun, saya memiliki masalah ini di MonoDevelop, dan harus menetapkan namespace default yang sama dengan file cs yang memanggil sumber daya (file yang kode yang terkandung seperti kode di bawah ini) ...

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

Setelah mengatur namespace default melalui GUI, baris di atas tidak lagi menyebabkan pengecualian.

Poikilo
sumber
1

Kasus lain. Saya menyalin solusi dengan dua proyek dan menamainya kembali sebagian di Windows explorer (nama folder, nama file .sln dan .csproj) dan sebagian dengan tindakan Cari & Ganti besar-besaran di Visual Studio (ruang nama dll.). Namun demikian pengecualian yang dinyatakan oleh OP masih terjadi. Saya menemukan bahwa nama Majelis dan Namespace masih lama.

Meskipun proyek dan segala sesuatu yang lain sudah bernama OfficeStyle yang Assembly namedan Default namespacemasih bernama Linckus .

Situasi lama

Setelah koreksi ini semuanya bekerja dengan baik lagi, kompilasi dan jalankan waktu :)

Situasi baru

Bernoulli
sumber
0

Dalam kasus saya, baris kode ini ditambahkan ke Web.configbanyak membantu:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

Bersama dengan tindakan membangun: Embedded Resourcedan Alat Kustom: PublicResXFileCodeGenerator.

m_david
sumber
0

Properti Double Klik di bagian Aplikasi memeriksa nama Majelis dan namespace default adalah sama

DevC
sumber
0

Saya juga menghadapi masalah yang sama, mencoba semua solusi yang disebutkan dalam jawaban tetapi tidak ada yang berhasil. Ternyata itu selama checkin kode ke TFS. TFS tidak checkin file Resx itu hanya diperiksa di file desainer. Jadi semua pengembang lain menghadapi masalah ini saat berjalan di mesin mereka. Memeriksa file resx secara manual melakukan trik

Kayani
sumber
Apa yang Anda maksud dengan "check-in"?
Fandango68
Mendorong file ke TFS
Kayani
0

Ini juga dapat terjadi ketika menempatkan kelas di atas kelas winform utama (Form1, misalnya) Anda bisa melihat ini ketika Anda melihat desain, karena gagal dirender.

Williamw
sumber
0

Namun penyebab lain: jika namespace Anda memiliki tanda hubung ("-"), maka itu akan membangun dan berjalan dengan benar, tetapi sumber daya tidak akan dapat diakses. Ruang nama (pengidentifikasi) tidak seharusnya memiliki tanda hubung, tetapi ini tampaknya tidak ditegakkan di mana pun kecuali dalam memuat sumber daya. Ini telah membakar saya dua kali selama dekade ini.

beanmf
sumber
0

Hal lain yang perlu diperiksa adalah apakah Anda memiliki LogicalName atau ManifestResourceName yang didefinisikan pada EmbeddedResource. Pastikan itu didefinisikan dengan tepat jika file proyek Anda menggunakannya karena mereka dapat menyebabkan sumber daya hidup dengan nama yang tidak Anda harapkan.

David Engel
sumber
0

Saya menghadapi masalah ini untuk menjalankan perintah Migrasi. Update-Databasedi konsol Package Manager.

Jawaban yang diterima tidak menyelesaikan masalah saya.

Saya harus mengubah Build Action dari Compilemenjadi Embedded Resourcedan Ini berhasil bagi saya.

Anda dapat melakukan hal yang sama menggunakan langkah-langkah di bawah ini:

  1. Klik kanan pada migrasi.
  2. Ubah properti "Build Action" "Kompilasi" menjadi "Sumber Daya Tertanam"
  3. Jalankan perintah Update-Database.
immirza
sumber
0

Untuk pengguna yang menghadapi masalah ini dalam. NET Core 3.0, ini bisa terkait dengan perubahan yang dibuat pada. NET Core 3.0, untuk menyelesaikannya hanya disetel EmbeddedResourceUseDependentUponConventionke false di proyek Anda csproj:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
Soheil Alizadeh
sumber
0

Klik kanan pada sumber daya dan pilih Run Custom Tool

Ini akan memperbaiki perancang

Michele Bortot
sumber
-1

Hanya karena Anda mereferensikan DLL Proyek B tidak berarti Manajer Sumber Daya Proyek A mengetahui direktori App_GlobalResources Proyek B.

Apakah Anda menggunakan proyek situs web atau proyek aplikasi web? Dalam yang terakhir, Visual Studio harus memungkinkan Anda untuk menautkan file kode sumber (tidak yakin tentang yang pertama, saya tidak pernah menggunakannya). Ini adalah fitur yang sedikit diketahui tetapi bermanfaat, yang dijelaskan di sini . Dengan begitu, Anda dapat menautkan file sumber daya Proyek B ke dalam Proyek A.

Heinzi
sumber