Belirtilen kültür veya nötr kültür için uygun kaynak bulunamadı


194

İki ASP.NET Web projem var (ProjectA ve ProjectB). ProjectA sınıf Blah.resx bir kaynak dosyası kullanan bir ProjectB sınıfı somutlaştırırken, bu hatayı alıyorum:

Mscorlib.dll dosyasında 'System.Resources.MissingManifestResourceException' türünde bir kural dışı durum oluştu, ancak kullanıcı kodunda işlenmedi.

Belirtilen kültür veya nötr kültür için uygun kaynak bulunamadı. Derleme zamanında "Resources.Blah.resources" dosyasının "App_GlobalResources.sn_flri6" derlemesine doğru bir şekilde katıştırıldığından veya bağlandığından veya gereken tüm uydu derlemelerinin yüklenebilir ve tam olarak imzalanmış olduğundan emin olun.

Buna ne sebep oluyor?

Microsoft'un sitesinde bu http://support.microsoft.com/kb/318603 ile ilgili bir makale bulunmaktadır :

Bu sorunu gidermek için <a0> </a0>, diğer sınıf tanımlarını formun sınıf tanımından sonra görünecek şekilde taşıyın.

Bu Windows Forms projesi için bir çözüm, bunun Web projeleri için de geçerli olup olmadığından emin değilim.


Bunlar ne tür projeler? 2 web sitesi? 1 web sitesi, 1 sınıf kütüphanesi?
Ruddy

İki ASP.NET Web Sitesi Projesi.
dev.e.loper

11
+1 için To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.Bu sorunumu çözdü.
OmarOthman

1
Windows.Forms Project Microsoft Yardım bağlantısı ile soru tanımınızı + 1'leyin sorunumu düzeltti.
DarrenMB

Bu cevap benim için problemi çözdü! GetGlobalResourceObject
DanielV

Yanıtlar:


257

Aynı istisnayı bir WPF projesinde vurdum. Sorun, yakın zamanda başka bir ad alanına ( ProblemAssembly.Supportto ProblemAssembly.Controls) taşıdığımız bir montajda meydana geldi . Derlemede bulunan ikinci bir kaynak dosyasından kaynaklara erişmeye çalışırken kural dışı durum oluyordu.

Ek kaynak dosyasının, başvuruları eski ad alanı adından yeni ad alanı adına düzgün bir şekilde taşımadığı ortaya çıkıyor.

Kaynak dosyasının designer.cs dosyasında, ResourceManager'ı almak için statik bir özellik vardır. Bu alıcıda, dize hala eski ad alanını ifade ediyordu. Yeni ad alanına düzeltildikten sonra sorun çözüldü:

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

olması gerekirdi:

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

Umarım bu bir sonraki kişiye yardımcı olur.


5
+1 Nedeni tasarımcı dosyasında nerede bulacağınızla ilgili iyi açıklama. Sizinle aynı sorunu buldum ve düzelttik :)
Gone Coding

1
bağlantı: ResourceManager sınıfı için MSDN belgeleri .
Boynst

3
Teşekkürler bu sorunu çözmeme yardımcı oldu. Ayrıca tasarımcı dosyasını silebilir, daha sonra tasarımcı dosyasını doğru bir şekilde yeniden oluşturmak için resx dosyasını açabilir ve kaydedebilirsiniz.
Serge

1
Aynı sorunu yaşadım ve aradığım cevap buydu. Ne yazık ki derleme zamanında görünmüyor :-( Teşekkürler
noob

2
teşekkürler de bu sorunu vardı ama bunun nedeni projenin ad alanının son kısmı ile aynı ada sahip bir alt klasör ekledi çünkü proje.folder.class yerine project.folder.folder.class arıyordu. Köklere taşıdım ve şimdi sıralanıyor ve çalışıyor!
SelAromDotNet

115

Sorunu şu şekilde çözdüm:

  1. ResourceFile sağ tıklayın
  2. "Derleme Eylemi" özelliğini "Katıştırılmış Kaynak" olarak değiştirin
  3. Sonra inşa et ve çalıştır

Mükemmel çalışıyor.


@sibi Elango ResourceFile'ımı sağ tıklatıyorum, ancak Build Action bölümünü bulamıyorum.
S5498658

1
@ S5498658 Bunu bağlam menüsünde görmüyorsanız (sağ tıklama), Özellikler paneline bakın (genellikle çözüm gezgininin altında bulunur).
tanımlar

Yapım eylemi ama hala çalışmıyor. Ayrıca dizin ve dizin özellikleri altında aynı olduğunu kontrol ettim.
albatros

1
Cevabın bu çözümün neden işe yaradığını açıklaması harika olurdu.
Luis Teijon

Bu sadece harika
code4j

22

Bir source.resx dosyasını bir C # projesinden başka bir C # projesi ile paylaşmaya çalıştığımda, bu sorunu aldım. Form sınıfını dosyasının başına taşıma önerisi uygun değildi. Ben böyle çözdüm. Temel olarak ikinci projeden ilk projeye bir bağlantı kullanırsınız, ardından resource.designer.csdosyanın yeniden oluşturulmasını etkinleştirirsiniz .

  1. İkinci projenin Properties/Resources.resxdosyasını sil
  2. İlk projenin Properties/Resources.resxdosyasını ikinci projedeki Özellikler klasörüne LINK olarak ekleyin . Projenin kök düzeyine eklemeyin.
  3. Etmeyin ilk proje 's eklemek Properties/Resources.designer.cs!
  4. İkinci projenin özelliklerine CustomTool olarak Resources.resxekleyinResXFileCodeGenerator
  5. Sağ tıklayın Resources.resxve "Özel Aracı Çalıştır" ı seçin. Bu yeni bir designer.cs dosyası oluşturur.

Not: Bu otomatik oluşturulduğu için resource.designer.cs dosyasını düzenlemekten kaçınırım.


12

Benim durumumda, bir dizi kötü düşünülmüş global metin değiştirmesi, kaynak tasarımcısı cs dosyasında bu satırı yanlışlıkla değiştirmişti.

resim açıklamasını buraya girin

Bu bağımsız değişkende ad alanı artık sınıfın ad alanıyla eşleşmediğinden, uygulama çalışma zamanında karıştı.

Tasarımcının ad alanının bu satırdaki dize bağımsız değişkeniyle eşleşip eşleşmediğini kontrol edin.


1
benim sorunumdu. Paylaşım için teşekkürler!
AcidJunkie

Aynı: PCL'den .NET Standard'a geçtikten sonra, tüm taşınabilir dosyaları kopyaladığım, taşınabilir projeyi kaldırdığım ve ad alanını orijinaline geri döndürdüğüm geçici bir proje ve ad alanı oluşturduğumda, bu satır hala geçici geçiş işleminden ad alanı.
Zerga

11

Bunun nedeni *.resхgöçün dışında tutulmasıdır.

  • ResourceFile sağ tıklayın
  • "Projeye dahil et" menü noktasını tıklayın

2
Bu benim için düzeltildi. Normalde resx dosyası otomatik olarak eklenir. Proje dosyasını değiştirmek ve geçişleri manuel olarak eklemek zorunda kaldığım bir birleştirme yaptım, bu yüzden belki bununla bir ilgisi vardı
smarty

Benim için çalıştı. Her taşıma işleminin tüm * .resx dosyalarını eklemeliyim. Teşekkürler
m.rufca

7

Designer.cs dosyasını silmenin, resx dosyasını projeden hariç tutup daha sonra yeniden dahil etmenin, bir ad alanı yeniden düzenleme işleminden sonra (CFinck'in cevabına göre)


Bunu benim için yaptı! (CFinck'in cevabını alakalı göründüğü gibi denedi, ancak işe yaramadı)
winwaed

Gerçekten de en hızlı çözümlerden biri
Lorenz Lo Sauer

6

Kimse bu çözümden bahsetmemiş gibi görünüyor. Açıkçası - ama beni bir anlığına taktı ...

Yeni bir kaynak dosyası için varsayılan erişim değiştirici Internal(veya FriendVB.Net'te). Bunu değiştirdiğinizden emin olun.Public

(resx tasarımcısında erişim değiştirici için üstte bir açılır menü bulunur)


4

Sibi Elangos tek başına cevap benim için yeterli değildi, bu yüzden

  • ResourceFile sağ tıklayın
  • "Eylem Oluştur" özelliğini değiştirme
  • "Katıştırılmış Kaynak" için derleme
  • Oluşturun ve dağıtın

Bu, /binklasörünüzde bir App_GlobalResources oluşturur , şimdi bu klasörü web uygulamasının kök dizinine de kopyalar


4

Benim durumumda, sınıfı yanlış şekilde tanımlamanın neden olduğu sorun:

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

BackendObjectSonuna (Dosyayı ayırmak daha iyi) yeniden tahsis ettikten sonra , proje temizleme + yeniden oluşturma işlemi sorunu çözdü.


1
Vay canına, dosyanın başlangıcında yanlış bir sınıfa sahip olmanın işleri çok kötü kıracağının farkında değildim.
BrainStorm.exe

4

Kaynak dosyamın kaydedildiği projeye giderek, ItemGroup'a ilerleyerek ve derleyicinin beklediği yola karşılık gelen mantıksal bir ad ekleyerek bunu çözdüm.

EmbeddedResource'um şöyle görünüyordu:

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

Şimdi böyle görünüyor

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

3

Bu durumda, kaynakları içeren derlemenin varsayılan ad alanının aynı metne ayarlanıp ayarlanmadığını kontrol edin (Project-> Properties-> Varsayılan ad alanı; VS'de) Resx dosyasının BuildAction özelliği "Embedded" olarak ayarlanmış olup olmadığını da kontrol edin kaynak "Keyfini çıkarın ...;)


1
Merhaba, varsayılan ad alanı (xxx) metninin Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
koddakiyle

2

Bir yaklaşım, paylaşılan sınıfları / kaynakları ayrı bir sınıf kütüphanesi projesine yerleştirmek ve her iki web sitesine yönlendirmek olacaktır.


2
Elbette bu aynı problem, değil mi?
Brett Rigby

2

Teşekkürler @CFinck! Sadece başkalarına bir ipucu eklemek için: ResourceManager satırını bununla değiştirdim:

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

Ben vb.net ama ben C # düşünüyorum tek fark + yerine dizeleri bitiştirmek için olurdu.

Bu şekilde kaynakları paylaşan iki benzer projede aynı bağlantılı montaj dosyalarını kullanabilirim.


1

Bu hata Dotfuscation tarafından da ortaya çıkar, çünkü bir resx tasarımcı dosyası yansımayı temel alır. Dotfuscator kullanıyorsanız resx dosyalarınızı bozacaktır. Bunları her zaman gizleme sürecinden dışlama olarak eklemelisiniz.


1

Kullanırken

HttpContext.GetGlobalResourceObject()

Bu çağrıyı bir try / catch deyiminin içine sarmadıkça bu hatayı oluşturur.


1

Çözümde tek bir proje ile bir WinForms uygulama var. IDE olarak kullanmak için
hedefleme.NET Framework 4.0
SharpDevelop 4.3

Sesler saçma, ama olan oldu Logical Namemülk seti "Resources"benim üzerinde "Resources.resx"dosyaya. Ben bu özelliği temizledikten sonra, tüm işler iri-dory.

Normalde, rastgele dosyalar eklediğinizde EmbeddedResource, genellikle Logical Namemakul bir şeye ayarlamak istersiniz , bazı nedenlerden dolayı, Resources.resxdosyada aynı şeyi yaptım ve hepsi berbattı ...

Umarım bu birine yardımcı olur.


Ben de öyle görünüyordu. Bir adlandırma çatışması sanırım, iyi bulmak!
Trent

1

Benim için sorun .resx dosyalarını ve ilişkili .cs dosyalarını bir projeden diğerine kopyalamaktı. Her iki proje de aynı isim alanına sahipti, bu yüzden problem değildi.

Son olarak, özgün projede .resx dosyalarının .cs dosyalarına bağlı olduğunu fark ettim.

MyResource.cs
|_ MyResource.resx

Kopyalanan projede .cs dosyaları .resx dosyalarına bağımlıydı:

MyResource.resx
|_ MyResource.cs

İkinci projede bir şekilde .resx dosyalarının .cs dosyalarını otomatik olarak oluşturacak şekilde ayarlandığı ortaya çıktı. Otomatik oluşturulan .cs dosyaları, orijinal projeden kopyalanan .cs dosyalarının üzerine yazılıyor.

Sorunu gidermek için kopyalanan projedeki her .resx dosyasının özelliklerini düzenleyin. Özel Aracı özelliği gibi bir şey ayarlanacaktır ResXFileCodeGenerator . .Resx dosyasının Özel Araç özelliğini temizleyin . Otomatik oluşturulan dosyanın üzerine yazacağı için, .cs dosyasını orijinal projeden yeniden kopyalamanız gerekir.



1

Bu, eşleşmeyen ad alanlarından kaynaklanabilir. Üst yanıttan ikinci (Sibi Elango's) resx dosyasını sağ tıklatıp Oluştur seçeneğini EmbeddedResource olarak değiştirdiğini söylüyor, ancak bunu zaten yaptım ve hala hatayla karşılaştım. Üst yanıt (CFinck's) dosyaları elle düzenleme yoluyla düzeltmenin bir yolunu not eder, ancak MonoDevelop'da bu sorun vardı ve varsayılan ad alanını kaynak ( aşağıdaki kod gibi)

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

GUI aracılığıyla varsayılan ad alanını ayarladıktan sonra, yukarıdaki satır artık bir istisnaya neden olmamıştır.


1

Sadece bir dava daha. Bir çözümü iki projeyle kopyaladım ve bunları kısmen Windows Gezgini'nde (klasör adları, .sln ve .csproj dosya adları) ve kısmen de Visual Studio'da (ad alanları vb.) Büyük bir Bul ve Değiştir eylemiyle yeniden adlandırdım. Bununla birlikte, OP tarafından belirtilen istisna hala gerçekleşmiştir. Meclis ve Ad Alanı adlarının hala eski olduğunu öğrendim .

Her ne kadar proje ve diğer her şey zaten OfficeStyle olarak adlandırıldı Assembly nameve Default namespacehala Linckus olarak adlandırıldı .

Eski durum

Bu düzeltmeden sonra her şey tekrar iyi çalıştı, derleyin ve çalışma süresi :)

Yeni durum


0

Benim durumumda bu kod satırları Web.configçok yardımcı oldu:

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

Build action: Embedded Resourceve Custom Tool: ile birlikte PublicResXFileCodeGenerator.


0

Uygulama bölümündeki Çift Tıklama özellikleri , Montaj adı ve varsayılan ad boşluğunun aynı olduğunu kontrol edin


0

Ben de aynı sorunla karşı karşıyaydım, cevapta bahsedilen tüm çözümleri denedim ama hiçbiri işe yaramadı. TFS kodunun check-in sırasında ortaya çıktı. TFS, yalnızca tasarımcı dosyasında kontrol edilen Resx dosyasını kontrol etmedi. Yani diğer tüm geliştiriciler makinelerinde çalışırken bu sorunla karşı karşıya kaldılar. Resx dosyasını manuel olarak kontrol etmek hile yaptı


"Check in" ile ne demek istiyorsun?
Fandango68

Dosyayı TFS'ye aktarma
TFS'ye

0

Bu, bir sınıfı ana winform sınıfının (örneğin, Form1) üzerine koyarken de oluşabilir. Oluşturulmadığı için tasarıma baktığınızda bunu görebilirsiniz.


0

Yine başka bir neden: ad alanınızda bir kısa çizgi ("-") varsa, doğru şekilde oluşturulacak ve çalışacak, ancak kaynağa erişilemeyecek. Ad alanlarının (tanımlayıcıların) kısa çizgileri olması gerekmez, ancak bu kaynak yükleme dışında hiçbir yerde zorunlu görünmemektedir. Bu on yıl boyunca beni iki kez yaktı.


0

Kontrol edilmesi gereken başka bir şey, EmbeddedResource üzerinde tanımlanmış LogicalName veya ManifestResourceName olup olmadığıdır. Proje dosyanız bunları kullanıyorsa, bunların uygun şekilde tanımlandığından emin olun, çünkü kaynaklar beklemediğiniz bir ad altında yaşamaya neden olabilir.


0

Geçiş komutunu çalıştırmak için bu sorunla karşılaştım.Update-DatabasePaket Yöneticisi konsolunda.

Kabul edilen cevap sorunumu çözmedi.

Ben gelen değişim Yapı Eyleme vardı CompileiçinEmbedded Resource ve benim için çalıştı.

Aşağıdaki adımları kullanarak da aynısını yapabilirsiniz:

  1. Taşımayı sağ tıklayın.
  2. "Derleme Eylemi" özelliği "Derleme" yi "Katıştırılmış Kaynak" olarak değiştirin
  3. Update-Database komutunu çalıştırın.

0

.NET Core 3.0'da bu sorunla karşılaşan kullanıcılar, bu , proje csproj'unuzda false olarak ayarlanmış olan sorunu çözmek için .NET Core 3.0'da yapılan bir değişiklikle ilgili olabilir EmbeddedResourceUseDependentUponConvention:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>


-1

Project B'nin DLL başvuruyor olmanız, Project A'nın Kaynak Yöneticisi Project B'nin App_GlobalResources dizinini bildiği anlamına gelmez.

Web sitesi projeleri veya web uygulama projeleri kullanıyor musunuz? İkincisinde, Visual Studio kaynak kod dosyalarını bağlamanıza izin vermelidir (eskisinden emin değilim, onları hiç kullanmadım). Bu, burada açıklanan az bilinen ancak kullanışlı bir özelliktir . Bu şekilde, Proje B kaynak dosyalarını Proje A'ya bağlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.