MissingManifestResourceException anlamı ve nasıl düzeltilir?


151

Durum:

  • Denilen RT.Servers, birkaç kaynak içeren bir sınıf kitaplığım var (türünün byte[]önemli olduğunu düşünmüyorum)
  • Aynı sınıf kitaplığı bu kaynaklardan birini döndüren bir yöntem içeriyor
  • Yalnızca bu yöntemi çağıran basit bir program (bu kitaplığa başvuru ile) var

MissingManifestResourceExceptionAşağıdaki mesajla bir alırım :

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

Hiç kültürlerle veya meclis imzasıyla oynamadım, bu yüzden burada neler olduğunu bilmiyorum. Ayrıca, aynı kütüphaneyi kullanan başka bir projede çalışır. Herhangi bir fikir?


2
Bu, .NET'teki en yararsız özel durumlardan biridir. Ortak hiçbir şeyi paylaşmayan en az 3 senaryoda tetiklenir.
rr-

1
Maalesef, Microsoft'un bir yoludur: tümünü kaldırın ve tekrar ekleyin . Kaynaklar, NUGET, referanslar ve bağlantı dizgileri için çalışır. Çok fazla araç var, ancak olağan olmayan durumlarda ham dosyalar için zaman harcayacaksınız ...
maxkoryukov

Yanıtlar:


238

Bu sorunu gidermek için tek yapmam gereken Resources.resx, Çözüm Gezgini'nde dosyayı sağ tıklayıp Özel Aracı Çalıştır'ı tıklamaktı . Bu otomatik oluşturulan Resources.Designer.csdosyayı yeniden oluşturur .

.Resx dosyası projeye el ile eklenmişse, dosyanın Özel Araç özelliği "ResXFileCodeGenerator" olarak ayarlanmalıdır.

Sorun, proje ayarlarında derlemenin "varsayılan ad alanını" değiştirirseniz, ad alanlarının uyumsuzluğundan kaynaklanır. (Ben daha önce değiştirdim)"Servers" (şimdi) olarak değiştirdim "RT.Servers".)

Otomatik oluşturulan kodda Resources.Designer.csşu kod vardır:

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

Değişmez dize "Servers.Resources"olarak değiştirilmeliydi "RT.Servers.Resources". Bunu el ile yaptım, ancak özel aracı çalıştırmak eşit derecede iyi olurdu.


9
Bu bana çok zaman kazandırdı!
Eric

1
1! VS 2010'da, yukarıda gösterilen ResourceManager değişmez dizgisi, en azından WinForms için proje özelliklerinde (Uygulama sekmesi) Varsayılan Ad Alanı değerine otomatik olarak güncelleştirilir.
TrueWill

2
Resources.resx dosyanız yoksa?
ashes999

@ ashes999: Özellikler klasörüne baktınız mı? Genellikle en azından C # projeleri için burasıdır.
RenniePet

Ben de aynı sorunu çalıştırdı. daha sonra .resx dosyası. nasıl yapabilirim ....
Kavitha

37

Bugün bu sorunla daha yeni karşılaştım ve bu soruna geçici bir çözüm sağlayan bu Microsoft Yardım ve Destek sayfasını buldum .

Dosyamın üstünde, global ad alanında birkaç delege vardı ve birden MissingManifestResourceExceptionbu programı çalıştırırken aniden alıyordum :

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

Sonra delegeleri isim alanına taşıdım, aynı hatayı aldım. Sonunda delegeleri bu dosyadaki tek sınıfa koydum ve hata gitti, ancak delegelerin o sınıfta veya ad alanında olmasını istemedim.

Sonra yukarıdaki bağlantıya rastladım.

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.

Temsilcileri ("sınıf tanımları" olarak değerlendirmeyeceğim) bu dosyanın altına, yerel ad alanının dışına koydum ve program MissingManifestResourceExceptionartık alamadım . Ne sinir bozucu bir hata. Ancak, bu otomatik olarak oluşturulan kodu değiştirmekten daha sağlam bir çözüm gibi görünüyor :)


Cevabınız için teşekkürler. Bu, aynı belirtiye neden olan farklı bir sorununuz olduğu anlaşılıyor. Kodumda fazladan dersler yoktu, aslında hiç formum bile yoktu. Otomatik olarak oluşturulan kodu değiştirmem gerektiğini keşfettiğim için önceki cevabımı düzenlemeliyim. Ben sadece kod üreteci yeniden çalıştırmak olabilir, ve kendini düzeltmiş olurdu. İnşa sürecinin neden otomatik olarak yapmadığı hakkında bir fikrim yok.
Timwi

7
(Sağladığınız bağlantının "Çözüm" bölümünde açıklandığı gibi) Form1.cs dosyasında Form sınıfının üzerinde bir sınıf ekleme nedeniyle hata aldım. Teşekkürler!
Matt Smith

Aynı sorun; başka bir şey çalışmıyordu, bu yüzden sadece satırı sildim: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); çünkü o formdaki simgeyi umursamıyorum :)
Gary Huckabone

Cevap bu. Teşekkür ederim.
Sertan Pekel

Anyones karıştı, ben Form1.cs "Form1" bit önce "StringExtensions" adlı bir sınıf vardı, ben Form1.cs yukarıdaki yerine Form1 altında taşındı ve işe yaradı
Ma Dude

31

Benzer bir sorunla karşılaştım ve OP'nin sebebi olmadığını bilmeme rağmen, buraya göndereceğim, böylece gelecekte başka biri bu problemle karşılaşırsa bir cevap mevcut olacak.

Tasarımcı sınıfından önce bir sınıf eklerseniz MissingManifestResourceException, çalışma zamanında bir istisna alırsınız (derleme zamanı hatası veya uyarısı yoktur).

Visual Studio tasarımcıların dosyadaki birinci sınıfı kullanmasını gerektirir.

(Biraz) daha fazla bilgi için bu gönderiye bakın .


12
Bu "yanıtı" gönderdiğiniz için teşekkür ederiz. OP'nin sorununa göre "konu dışı" olmasına rağmen, burada yayınlamak iyi bir fikirdi. MissingManifestResourceException için yapılan bir arama beni bu konuya yönlendirdi ve cevabım için cevabınız yerinde oldu.
RenniePet

16

Aynı sorunu yaşadım, ancak Timwi tarafından önerilen Özel Aracı Çalıştır komutunu kullanmak benim durumumda yardımcı olmadı.

Ben bitti çünkü Ancak, doğru yönde beni neden Özellikleri ait .resx dosyası. Burada başka bir .resx dosyasında hiçbir soruna neden olmayan bir fark fark ettim .

Benim durumumda "Build Action" özelliğini "Resource" dan "Embedded Resource" olarak değiştirmek zorunda kaldım.

Nedeni için en iyi tahmin , başka bir uygulamadan kullanılan bir kütüphanede .resx vardı . Uygulamamın kendi .resx dosyası yoktu , bu yüzden kütüphaneden bir tane kullanmak zorundaydı - bu sadece kütüphaneye gömülü olduğunda ve "tek başına" değil.


2
+1 teşekkürler, diğer uygulamalar tarafından başvurulan ayrı bir kütüphanede bulunan kaynak dosyalarımı tekrar kontrol ettim. İçerik Oluşturma ayarını yaptım ve Gömülü Kaynak olarak değiştirdikten sonra hepsi iyi çalıştı. Aptal gözetim
Shan Plourde

1
Teşekkürler! Bu, test için içerik veya bazı iş haritalama kuralları içeren bazı metin dosyalarım olduğu için benim için çalıştı. İçerikten Gömülü Kaynağa geçmek sorunu çözdü.
S. Baggy

12

Ben benzer bir sorunu çalıştırdığınızda, Vs 2012, resx dosyasının "Özel Araç Ad Alanı" özelliğinin yanlış olduğu ortaya çıktı (benim durumumda, aslında ayarlanmamıştı, bu nedenle oluşturulan kod çalışma zamanında bu istisnayı yeld) . Resx dosyası için son özelliklerim şöyle:

  • Eylem oluştur: Katıştırılmış Kaynak
  • Çıktı Dizine Kopyala: Kopyalama
  • Özel Araç: ResXFileCodeGenerator
  • Özel Araç Ad Alanı: My.Project.S.Proper.Namespace

3

Ayrıca bakınız: MSBuild ile oluşturulduktan sonra testleri çalıştırırken MissingManifestResourceException (.mresource dosyasında yol var)

Cevabı burada tamlık için tekrarlıyorum:

Proje dosyasına LogicalName ekleyerek görünür:

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

yani proje dosyasındaki gömülü kaynak girişi şuna benzer:

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

Bu ayrıntılar: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Bir .resx dosyası kullandığımızı ancak hatanın hala oluştuğunu unutmayın.

Güncelleme: Kaynaklarla ilgili sorun (XAML dahil) çıktı yollarıyla ve aşağıda açıklandığı gibi ileri veya geri eğik çizgilerin kullanımı ile ilgili gibi görünüyor: Proje çıktı dizinlerini değiştirmek neden: IOException işlenmedi "Kaynak bulunamıyor 'app.xaml' ."


Bu sorunu ayıkladıktan yaklaşık sekiz saat sonra ve kelimenin tam anlamıyla her github, SO ve Google cevabını trol ettikten sonra, sorunumu çözen cevap budur ... fwiw, sorunum .Net 3.5'ten 4.7.2'ye geçtikten sonra gerçekleşmeye başladı.
Neville

3

Ben resx dosyaları ile ilgisiz bu sorunun farklı bir neden koştu. AssemblyInfo.cs aşağıdakileri içeren bir sınıf kitaplığı vardı:

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

Derleme herhangi bir WPF kodu, tema veya Kaynak sözlük içermiyordu. ThemeInfo özniteliğini kaldırarak kural dışı durumdan kurtuldum.

Sadece gerçek bir istisna almadım

'System.Resources.MissingManifestResourceException' türünün ilk şans istisnası.

Kural dışı durum ayrıntılarını görüntüleyen sistem, MyAssembly.g.resources dosyasını istiyordu

Umarım bu başka birine yardımcı olabilir.


2
Bunun için teşekkür ederim! Tam olarak ihtiyacım olan düzeltme! Yanlışlıkla bir Kontrol kütüphanesi olarak bir ViewModel projesi oluşturduğunuzda olur.
Andrew Hanlon

Teşekkür ederim. Bu benim için düzeltildi.
Jamleck

2

İnsanlara yardımcı olacağından emin değilim ama bu benim için çalıştı:

Yani yaşadığım sorun şu mesajı alıyordum:

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

Başka bir sınıf kütüphanesinden projeme gömülü kaynakları almaya çalışıyordum.

Sorunu çözmek için ne yaptım Project-> Properties-> Resources sekmesinde Access Internalifier'ı "Internal" (yalnızca aynı sınıf kütüphanesinden erişilebilir) sekmesinden "Public" (başka bir sınıf kütüphanesinden erişilebilir) olarak ayarlamaktı

Sonra koş ve voilà, benim için artık hata yok ...


2

BlaM tarafından verilen çözüm de benim için çalıştı.

VS 2013 kullanıcısıyım. Birçok düzeltme geçirdikten sonra şanssız kaldıktan sonra bunu denedim:

  1. Birden fazla dosya olması durumunda kaynak dosyasını tek tek sağ tıklatın.
  2. "Derleme Eylemi" özelliğinin "Katıştırılmış Kaynak" olarak ayarlandığından emin olun.

Bu kadar! :)


Bunu onaylıyorum. Çalışan bir proje var ama kaynak derlemelerini ayrı ayrı korumak için gerekli, yani "Gömülü Kaynak" sadece "Kaynak" için çevirme denedim ve MissingResourceManifestException alma sona erdi.
Mosca Pt

2

Aynı sorunu vardı, ama benim durumumda böyle bir usercontrol ile ilgili bir usercontrol bir sınıf yerleştirir

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

Çözüm, MyUserControlObjectUsercontrol sınıfının sonuna,

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

Umarım bu yardımcı olur


Berbat bir hata açıklaması hakkında konuşun ... Ana formun CS dosyasına bir yardımcı sınıf ekledim. Asla hata mesajı bu geri bağlantı olacağını tahmin ediyorum. Teşekkürler!
Adam Lewis

1

Projemi VS2005'ten VS2010'a taşıdıktan sonra MissingManifestResourceException hatasını alıyordum. Form sınıfımı içeren dosyada tanımlanan başka bir sınıfım yoktu. Ayrıca resx Kaynak Dosya Adımı doğru ayarladım. İşe yaramadı.

Bu yüzden resx dosyalarını sildim ve yeniden oluşturdum. Şimdi her şey yolunda.


1

Son zamanlarda aynı sorunla karşılaştı, biraz uğraştı, bu konuyu buldu, ancak benim için hiçbir cevap doğru değildi.

Benim sorunum WPF projemden ana pencere kaldırdığımda (bir ana pencere yok), ben kaldırmayı unuttum StartupUrioldu App.xaml. Sana bir hata varsa bu durum ortaya çıkabilir tahmin StartupUriherkes bununla mücadele eğer öyleyse durumunda, - sizin kontrol StartupUriin App.xaml.


1

Son zamanlarda bu konuda tökezledi, benim durumumda birkaç şey yaptım:

  1. Resx dosyasının Designer.cs dosyasında ad alanlarının tutarlı olduğundan emin olun

  2. Derlemenin varsayılan ad alanının (projeyi sağ tıklatın ve Özellikler'i seçin) kaynak dosyasının bulunduğu ad alanı ile aynı olduğundan emin olun.

Adım 2 yaptığımda, istisna ortadan kalktı.


1

Formdan türetilen sınıftan hemen önce dosyaya başka bir sınıf eklediğimde bu sorunla karşılaştım. Sorunu giderdikten sonra eklemek.


1

Ayrıca, tasarımcı tarafından oluşturulan form sınıfının kaynak koduna yeni bir sınıf koyduğunuzda da aynı hata oluşabilir.

Bu yeni sınıf kaldırılabilir ve farklı bir cs dosyasına yerleştirilebilir.

(En azından benim durumumda sorun buydu ...)


0

Çünkü web uygulamamı önceden derliyorum (VS2012 yayınlama özelliğini kullanarak). Yukarıdaki hatayı alıyordum. Tüm önerileri denedim, ancak garip bir şekilde 'Eylem Oluştur' seçeneğini 'İçerik' olarak değiştirmek hile yaptı!


0

Benim durumumda, kaynakları olan bir web API'm var ve bundan bir nuget paketi oluşturuyorum. Bu nugeti diğer projelerde kullandığımda, kaynakları olan bir api istediğimde, MissingManifestResourceExceptionbiraz yeniden aramanın ardından alıyorum , nuget paketleyicisinin kaynakları otomatik olarak paketlemediğini öğreniyorum. Kaynak dosyalarını kullanmak istiyorsanız, bunu manuel olarak yapmanız gerekir. Bu nedenle .nuspec dosyanıza aşağıdaki satırları eklemeniz gerekir: ( https://github.com/NuGet/Home/issues/1482 adresini ziyaret edin )

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

Ancak, dosya eklemeden önce, hangi .net sürümünü kullandığınızdan emin olmanız gerekir.


0

Yeni oluşturulan bir F # projesi ile vardı. Çözüm, proje özelliklerinde "Standart kaynak adlarını kullan" seçeneğinin işaretini kaldırmaktı -> Uygulama -> Kaynaklar / Uygulama kaynaklarının nasıl yönetileceğini belirtin. Onay kutusunu görmüyorsanız, Visual Studio'nuzu güncelleyin! 15.6.7 yükledim. 15.3.2'de bu onay kutusu yoktur.


0

Sadece bahsetmek gerekirse. Bir sabit veya değişmez değer kullanıyorsanız, formun bir kaynağına ProjectName.Resourcesbaşvurduğundan ve cpntain olmadığından emin olun Resources.resx.

Bir iki saatinizi kurtarabilir.


0

Küresel ad alanını yeniden adlandırdıktan sonra WinForms tabanlı yönetilen C ++ projesi ile bu sorunla karşılaştım (el ile değil, VS2017 Yeniden Adlandırma aracı ile).

Çözüm basit, ancak başka bir yerde bahsedilmiyor.

RootNamespaceVcxproj dosyasındaki girdiyi C ++ ad alanıyla eşleşecek şekilde değiştirmeniz gerekir .


0

Benim durumumda Winforms Formundan açılan bir pencerenin Xaml'sinde bir yazım hatasıydı:

Yanlış: <Image Source="/Resources/WorkGreen.gif"/>

Doğru: <Image Source="../Resources/WorkGreen.gif"/> Birisine yardımcı olabilir


-3

Gönderen Microsoft destek sayfasında :

Bu sorun, uygun olmayan bir dosya adı olan bir .resources dosyası kullanarak oluşturduğunuz bir uydu derlemesinde bulunan yerelleştirilmiş bir kaynak kullanırsanız oluşur. Bu sorun genellikle el ile bir uydu derleme oluşturursanız oluşur.

Bu soruna geçici bir çözüm bulmak için <a0> </a0>, Resgen.exe çalıştırdığınızda .resources dosyasının dosya adını belirtin. .Resources dosyasının dosya adını belirtirken, dosya adının uygulamanızın ad alanı adıyla başladığından emin olun. Örneğin, dosya adının başında uygulamanızın ad alanı adına sahip bir .resources dosyası oluşturmak için Microsoft Visual Studio .NET komut isteminde aşağıdaki komutu çalıştırın:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources

1
Yanıtınız için teşekkürler, ancak ResGen.exe'nin ne olduğunu bilmiyorum, hiç kullanmadım ve açıkçası kullanmak istemiyorum çünkü fantezi bir şey kullanmaya çalışmıyorum. Kesinlikle bu Visual Studio'dan düzeltmek için bir yol olmalı? Örneğin, kaynağın "yerelleştirilmiş" olduğunu söylediğiniz için, bir kaynağı yerelleştirilmemiş olarak nasıl bildiririm? Tekrar teşekkürler.
Timwi
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.