MissingManifestResourceExceptionの意味と修正方法


151

状況:

  • と呼ばれるクラスライブラリがあり、RT.Servers(タイプのbyte[])いくつかのリソースが含まれていますが、それは重要ではないと思います)
  • 同じクラスライブラリには、これらのリソースの1つを返すメソッドが含まれています
  • その単一のメソッドのみを呼び出す単純なプログラム(そのライブラリへの参照付き)があります。

私が手MissingManifestResourceExceptionに次のメッセージを:

指定されたカルチャまたはニュートラルカルチャに適したリソースが見つかりませんでした。「Servers.Resources.resources」がコンパイル時にアセンブリ「RT.Servers」に正しく埋め込まれているかリンクされているか、必要なすべてのサテライトアセンブリがロード可能で完全に署名されていることを確認してください。

私は文化やアセンブリ署名で遊んだことがないので、ここで何が起こっているのかわかりません。また、これは同じライブラリを使用する別のプロジェクトでも機能します。何か案は?


2
これは、.NETで最も役に立たない例外の1つです。これは、何も共通点がない少なくとも3つのシナリオでトリガーされます。
rr-

1
すみませんが、これはMicrosoftの方法です。すべて削除してから、もう一度追加してください。リソース、NUGET、参照、接続文字列で機能します。たくさんのツールがありますが、通常でないケースでは生ファイルに時間を費やします...
maxkoryukov

回答:


238

この問題を修正するために必要なのResources.resxは、ソリューションエクスプローラーでファイルを右クリックし、[ カスタムツールの実行 ]をクリックすることだけでした。これにより、自動生成されたResources.Designer.csファイルが再生成されます。

.resxファイルをプロジェクトに手動で追加した場合、ファイルのカスタムツールプロパティを "ResXFileCodeGenerator"に設定する必要があります。

この問題は、プロジェクト設定でアセンブリの「デフォルトの名前空間」を変更した場合に発生する名前空間の不一致が原因です。((以前)"Servers"から(現在)に変更しました"RT.Servers"。)

で自動生成されたコードにResources.Designer.csは、次のコードがあります。

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

リテラル文字列"Servers.Resources"をに変更する必要がありました"RT.Servers.Resources"。私はこれを手動で行いましたが、カスタムツールを実行しても同じようにうまくいきます。


9
これにより多くの時間を節約できました!
エリック

1
+1!VS 2010では、上記のResourceManagerリテラル文字列は、少なくともWinFormsの場合、プロジェクトプロパティ([アプリケーション]タブ)の[既定の名前空間]の値に自動的に更新されます。
TrueWill

2
resources.resxファイルがない場合はどうなりますか?
ashes999 '09

@ ashes999:Propertiesフォルダーを調べましたか?これは通常、少なくともC#プロジェクトの場合です。
RenniePet

同じ問題が発生しました。.resxファイルがプロジェクトに手動で追加され、ファイルのカスタムツールプロパティが "ResXFileCodeGenerator"に設定されました。resxファイルが最初で、後でDesigner.vbファイルです。実際にDesingerファイルが最初で、後で.resxファイル。どのようにしてそれを作ることができます...
Kavitha

37

今日、この問題に遭遇しました。このMicrosoftヘルプとサポートのページで、実際に問題を回避できました。

私のファイルの先頭、グローバル名前空間にいくつかのデリゲートがありMissingManifestResourceException、プログラムを実行しているときに突然、次の行でを取得していました。

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

次に、デリゲートを名前空間に移動しましたが、同じエラーが発生しました。最後に、そのファイルの唯一のクラスにデリゲートを配置し、エラーはなくなりましたが、そのクラスまたは名前空間にデリゲートを配置したくありませんでした。

それから私は上のリンクに出くわしました、それは言った

この問題を解決するには、他のすべてのクラス定義を移動して、フォームのクラス定義の後に表示されるようにします。

デリゲート( "クラス定義"とは見なさない)をローカルネームスペースの外のファイルの下部に配置しましたが、プログラムはMissingManifestResourceExceptionもう取得しませんでした。なんと苛立たしいエラーでしょう。しかし、それは自動生成されたコードを変更するよりも堅牢なソリューションのようです:)


ご回答有難うございます。これは、同じ症状を引き起こす別の問題があったようです。私のコードには余分なクラスはありませんでした。実際、フォームもまったくありませんでした。実際に自動生成されたコードを変更する必要がないことがわかったので、以前の回答を編集する必要があります。コードジェネレーターを再実行するだけで、それ自体が修正されます。なぜビルドプロセスが自動的に行わなかったのかはわかりません。
ティムウィ2009

7
Form1.csファイルのFormのクラスの上にクラスを追加したためにエラーが発生しました(提供したリンクの「解決策」セクションで説明されています)。ありがとう!
マット・スミス

同じ問題; 何も機能していなかったので、次の行を削除しました:this.Icon =((System.Drawing.Icon)(resources.GetObject( "$ this.Icon"))); その特定の形のアイコンは気にしないからです:)
Gary Huckabone

それが答えです。ありがとうございました。
セルタンペケル

anyones私はForm1.csをの「Form1の」ビットの前に「StringExtensions」と呼ばれるクラスを持っていた混乱した場合、私はForm1.csではなく、上のForm1の下に移動し、それが働いた
馬デュード

31

私は同様の問題に遭遇しましたが、それがOPの原因ではないことはわかっていますが、ここに投稿します。将来誰かがこの問題に遭遇した場合に回答が利用できるようにします。

デザイナークラスの前にクラスを追加すると、MissingManifestResourceException実行時に例外が発生します(コンパイル時のエラーや警告はありません)。

Visual Studioでは、デザイナーがファイルの最初のクラスを使用する必要があります。

(少し)詳細については、この投稿を参照してください。


12
この「答え」を投稿していただきありがとうございます。OPの問題に関連して「オフトピック」であるにもかかわらず、ここに投稿することをお勧めします。MissingManifestResourceExceptionを検索したところ、このスレッドにたどり着きました。あなたの答えは、私の問題にぴったりでした。
RenniePet 2011年

16

私は同じ問題を抱えていましたが、Timwiによって提案されRun Custom Toolコマンドを使用しても、私の場合は役に立ちませんでした。

ただし、.resxファイルのプロパティになってしまったため、正しい方向に進みました。ここで、問題のない別の.resxファイルとの違いに気づきました。

私の場合、プロパティ「Build Action」を「Resource」から「Embedded Resource」に変更する必要がありました。

その理由は、他のアプリケーションから使用されたライブラリに.resxが含まれていたためと推測されます。私のアプリケーションには独自の.resxファイルがなかったため、ライブラリのファイルを使用する必要がありました。これは、「スタンドアロン」ではなく、ライブラリに埋め込まれている場合にのみ使用できます。


2
さらに、他のアプリケーションから参照されている別のライブラリにあるリソースファイルを再確認しました。私はビルドアクションをコンテンツに設定していて、それを埋め込みリソースに変更した後、すべてうまくいきました。愚かな見落とし
シャンプルーム

1
ありがとう!これは、テスト用のコンテンツまたはビジネスマッピングルールのいずれかを含むテキストファイルがいくつかある私にとってはうまくいきました。コンテンツから埋め込みリソースに変更すると、問題が修正されました。
S.バギー

12

Vs 2012で同様の問題を実行すると、resxファイルの「Custom Tool Namespace」プロパティが間違っていることがわかりました(私の場合、実際には設定されていないため、生成されたコードは実行時にこの例外を発生しました) 。resxファイルの最後のプロパティセットは次のようなものでした。

  • ビルドアクション:埋め込みリソース
  • 出力ディレクトリにコピー:コピーしないでください
  • カスタムツール:ResXFileCodeGenerator
  • カスタムツールの名前空間:My.Project.S.Proper.Namespace

3

MSBuildでビルドした後にテストを実行するとMissingManifestResourceExceptionも参照してください(.mresourceにはマニフェストにパスがあります)

完全を期すために、ここで答えを繰り返します。

LogicalNameをプロジェクトファイルに追加すると修正されます。

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

つまり、プロジェクトファイルの埋め込みリソースエントリは次のようになります。

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

詳細は次のとおりです:http : //blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

.resxファイルを使用していますが、バグはまだ発生しているようです。

更新:リソース(XAMLを含む)の問題は、出力パスと、スラッシュの使用に関連しているようです。詳細については、 プロジェクトの出力ディレクトリを変更する理由:IOExceptionが処理されなかった "リソース 'app.xaml'が見つかりません。 」


約8時間この問題をデバッグし、文字通りすべてのgithub、SO、およびGoogleの答えを調べた後、これが私の問題を解決した答えです... fwiw、私の問題は.Net 3.5から4.7.2に移行した後に発生し始めました。
ネビル

3

私はこの問題の別の原因に遭遇しましたが、これはresxファイルとは無関係でした。AssemblyInfo.csに以下が含まれるクラスライブラリがありました。

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

アセンブリにWPFコード、テーマ、またはリソースディクショナリが含まれていませんでした。ThemeInfo属性を削除して、例外を取り除きました。

実際の例外は発生しませんでした。

タイプ「System.Resources.MissingManifestResourceException」の最初の例外。

例外の詳細を表示すると、システムはMyAssembly.g.resourcesを要求していました

これが他の誰かの助けになることを願っています。


2
これありがとう!まさに私が必要とした修正!誤ってコントロールライブラリとしてViewModelプロジェクトを作成した場合に発生します。
Andrew Hanlon、2015年

ありがとうございました。これで解決しました。
Jamleck

2

それが人々を助けるかどうかわかりませんが、これは私にとってうまくいきました:

だから私が持っていた問題は私が次のメッセージを受け取っていたことでした:

指定されたカルチャまたはニュートラルカルチャに適したリソースが見つかりませんでした。「My.Resources.Resources.resources」がコンパイル時にアセンブリ「X」に正しく埋め込まれているかリンクされているか、または必要なすべてのサテライトアセンブリがロード可能で完全に署名されていることを確認してください "

プロジェクトに埋め込まれたリソースを別のクラスライブラリから取得しようとしていました。

この問題を修正するために行ったのは、[プロジェクト]-> [プロパティ]-> [リソース]タブのアクセス修飾子を "内部"(同じクラスライブラリ内でのみアクセス可能)から "パブリック"(別のクラスライブラリからアクセス可能)に設定することでした。

その後、実行してボイラします。これ以上エラーは発生しません...


2

BlaMによって与えられた解決策も私にとってうまくいきました。

私はVS 2013ユーザーです。多くの修正を行ったが運が悪かった後、私はこれを試しました:

  1. 複数ファイルの場合は、リソースファイルを1つずつ右クリックします。
  2. プロパティ「Build Action」が「Embedded Resource」に設定されていることを確認してください。

それでおしまい!:)


これを確認します。私は作業中のプロジェクトを持っていますが、リソースアセンブリを個別に維持する必要があるため、「Embedded Resource」から単に「Resource」に切り替えてみたところ、MissingResourceManifestExceptionが発生しました。
Mosca Pt

2

私は同じ問題を抱えていましたが、私の場合、ユーザーコントロールに関連するクラスをユーザーコントロールに配置します

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

解決策はMyUserControlObject、次のように、をUsercontrolクラスの最後に移動することでした

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

これが役に立てば幸い


くだらないエラーの説明について話します...メインフォームのCSファイルにヘルパークラスを追加しました。エラーメッセージがこれにリンクしているとは思いもしませんでした。ありがとう!
アダムルイス

1

プロジェクトをVS2005からVS2010に移植した後、MissingManifestResourceExceptionエラーが発生しました。私のFormクラスを含むファイルで定義されている他のクラスはありませんでした。また、resxリソースファイル名を正しく設定しました。うまくいきませんでした。

そこで、resxファイルを削除して再生成しました。すべて順調です。


1

最近同じ問題に遭遇し、少し苦労してこのトピックを見つけましたが、私にとって正しい答えはありませんでした。

私の問題は、私は(それがメインウィンドウを持っていない)私のWPFプロジェクトからメインウィンドウを削除するとき、私は削除し忘れたということでしたStartupUriからApp.xaml。私はあなたに間違いがある場合は、この例外が発生する可能性が推測StartupUri誰もがこれで苦労している場合はその場合には、 -あなたのチェックStartupUriではApp.xaml


1

最近この問題に遭遇しました。私の場合、私はいくつかのことをしました:

  1. 名前空間がresxファイルのDesigner.csファイルで一貫していることを確認してください

  2. アセンブリのデフォルトの名前空間(プロジェクトを右クリックして[プロパティ]を選択)が、リソースファイルがある名前空間と同じに設定されていることを確認します。

ステップ2を実行すると、例外はなくなりました。


1

Formから派生したクラスの直前のファイルに別のクラスを追加すると、この問題が発生しました。問題を修正してから追加します。


1

また、デザイナーが作成したフォームのクラスのソースコードに新しいクラスを追加したときにも、同じエラーが発生することがあります。

この新しいクラスは削除され、別のcsファイルに配置されます。

(少なくとも私の場合、これが問題でした...)


0

Webアプリケーションをプリコンパイルしているため(VS2012パブリッシュ機能を使用)。上記のエラーが発生しました。私はすべての提案を試しましたが、奇妙なことに「ビルドアクション」を「コンテンツ」に変更するとうまくいきました。


0

私の場合、リソースを持つWeb APIがあり、そこからnugetパッケージを作成します。他のプロジェクトでこのnugetを使用しているときに、リソースを使用してAPIを要求するとMissingManifestResourceException、少し再調査したところ、nugetパッケージャーがリソースを自動的にパックしていないことがわかりました。リソースファイルを使用する場合は、手動で行う必要があります。したがって、以下の行を.nuspecファイルに追加する必要があります:(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>

ただし、ファイルを追加する前に、使用している.netのバージョンを確認する必要があります。


0

新しく作成したF#プロジェクトを使用しました。解決策は、プロジェクトのプロパティで[標準リソース名を使用する]をオフにすることでした->アプリケーション->リソース/アプリケーションリソースの管理方法を指定します。チェックボックスが表示されない場合は、Visual Studioを更新してください。15.6.7をインストールしました。15.3.2では、このチェックボックスはありません。


0

言及するだけです。定数またはリテラルを使用する場合は、フォームのリソースを参照し、ProjectName.Resourcescpntainではないことを確認してくださいResources.resx

1〜2時間節約できます。


0

グローバルネームスペースの名前を変更した後(手動ではなく、VS2017の名前変更ツールを使用)、WinFormsに基づくマネージC ++プロジェクトでこの問題が発生しました。

解決策は簡単ですが、他では言及されていません。

RootNamespaceC ++名前空間に一致するようにvcxproj-fileのエントリを変更する必要があります。


0

私の場合、それはWinformsフォームから開いたウィンドウのXamlのタイプミスでした:

不正解: <Image Source="/Resources/WorkGreen.gif"/>

正しい:<Image Source="../Resources/WorkGreen.gif"/> それは誰かを助けるかもしれません


-3

マイクロソフトのサポートページ

この問題は、不適切なファイル名を持つ.resourcesファイルを使用して作成したサテライトアセンブリに存在するローカライズされたリソースを使用する場合に発生します。この問題は通常、手動でサテライトアセンブリを作成した場合に発生します。

この問題を回避するには、Resgen.exeを実行するときに.resourcesファイルのファイル名を指定します。.resourcesファイルのファイル名を指定するときは、ファイル名がアプリケーションのネームスペース名で始まることを確認してください。たとえば、Microsoft Visual Studio .NETコマンドプロンプトで次のコマンドを実行して、ファイル名の先頭にアプリケーションの名前空間名を含む.resourcesファイルを作成します。

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

1
お返事ありがとうございます。ただし、ResGen.exeが何であるかはわかりません。これまで使用したことがありません。率直に言って、派手なものを使用するつもりはないので、使用したくありません。確かに、これをVisual Studioから修正する方法があるはずです。たとえば、リソースが「ローカライズされている」と言ったので、リソースをローカライズされていないものとして宣言するにはどうすればよいですか?再度、感謝します。
ティムウィ2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.