この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
MissingManifestResourceException 例外は、.NET アプリと UWP アプリのさまざまな理由でスローされます。
.NET アプリ
.NET アプリでは、ニュートラル カルチャのリソース セットを特定のアセンブリから読み込めなかったためにリソースの取得が失敗すると、MissingManifestResourceException がスローされます。 特定のリソースを取得しようとすると例外がスローされますが、これはリソースを見つけられないためではなく、リソースセットを読み込めないことに起因します。
注
詳細については、 ResourceManager クラストピックの「MissingManifestResourceException 例外の処理」セクションを参照してください。
例外の主な原因は次のとおりです。
リソース セットは、その完全修飾名で識別されません。 たとえば、
baseNameメソッドの呼び出しのResourceManager.ResourceManager(String, Assembly) パラメーターが、名前空間を持たないリソース セットのルート名を指定しているが、そのアセンブリに格納されるときにリソース セットに名前空間が割り当てられている場合、ResourceManager.GetString メソッドの呼び出しによってこの例外がスローされます。既定のカルチャのリソースを含む .resources ファイルを実行可能ファイルに埋め込み、アプリが MissingManifestResourceExceptionをスローしている場合は、 IL 逆アセンブラー (Ildasm.exe) などのリフレクション ツールを使用して、リソースの完全修飾名を決定できます。 ILDasm で、実行可能ファイルの MANIFEST ラベルをダブルクリックして MANIFEST ウィンドウを開きます。 リソースは
.mresource項目として表示され、外部アセンブリ参照とカスタム アセンブリ レベルの属性の後に一覧表示されます。 次の単純なユーティリティをコンパイルすることもできます。このユーティリティには、アセンブリ内の埋め込みリソースの完全修飾名が一覧表示され、その名前がコマンド ライン パラメーターとして渡されます。using System; using System.IO; using System.Reflection; public class Example0 { public static void Main() { if (Environment.GetCommandLineArgs().Length == 1) { Console.WriteLine("No filename."); return; } string filename = Environment.GetCommandLineArgs()[1].Trim(); // Check whether the file exists. if (! File.Exists(filename)) { Console.WriteLine($"{filename} does not exist."); return; } // Try to load the assembly. Assembly assem = Assembly.LoadFrom(filename); Console.WriteLine($"File: {filename}"); // Enumerate the resource files. string[] resNames = assem.GetManifestResourceNames(); if (resNames.Length == 0) Console.WriteLine(" No resources found."); foreach (var resName in resNames) Console.WriteLine($" Resource: {resName.Replace(".resources", "")}"); Console.WriteLine(); } }Imports System.IO Imports System.Reflection Imports System.Resources Module Example3 Public Sub Main() If Environment.GetCommandLineArgs.Length = 1 Then Console.WriteLine("No filename.") Exit Sub End If Dim filename As String = Environment.GetCommandLineArgs(1).Trim() ' Check whether the file exists. If Not File.Exists(filename) Then Console.WriteLine("{0} does not exist.", filename) Exit Sub End If ' Try to load the assembly. Dim assem As Assembly = Assembly.LoadFrom(filename) Console.WriteLine("File: {0}", filename) ' Enumerate the resource files. Dim resNames() As String = assem.GetManifestResourceNames() If resNames.Length = 0 Then Console.WriteLine(" No resources found.") End If For Each resName In resNames Console.WriteLine(" Resource: {0}", resName.Replace(".resources", "")) Next Console.WriteLine() End Sub End Moduleリソース セットは、そのリソース ファイル名 (オプションの名前空間と共に) と、その名前空間とルート ファイル名のみでではなく、そのファイル拡張子で識別します。 たとえば、ニュートラル カルチャのリソース セットに
GlobalResourcesという名前が付けられ、GlobalResources.resourcesコンストラクターのGlobalResourcesパラメーターに (baseNameではなく) ResourceManager.ResourceManager(String, Assembly)の値を指定すると、この例外がスローされます。メソッド呼び出しで識別されるカルチャ固有のリソース セットが見つからないので、フォールバック リソース セットを読み込めません。 たとえば、英語 (米国) とロシア (ロシア) のカルチャ用にサテライト アセンブリを作成しても、ニュートラル カルチャのリソース セットを指定できない場合、アプリの現在のカルチャが英語 (英国) の場合、この例外がスローされます。
MissingManifestResourceException は、値が0x80131532を持つ HRESULT COR_E_MISSINGMANIFESTRESOURCEを使用します。
MissingManifestResourceException では、参照の等価性をサポートする既定の Equals 実装が使用されます。
MissingManifestResourceExceptionのインスタンスの初期プロパティ値の一覧については、MissingManifestResourceExceptionコンストラクターを参照してください。
注
サテライト アセンブリが使用できない場合にアプリが失敗しないように、メイン アセンブリにはニュートラル なリソース セットを含めるようにすることをお勧めします。
ユニバーサル Windows プラットフォーム (UWP) アプリ
UWP アプリは、ニュートラル カルチャを含む複数のカルチャのリソースを 1 つのパッケージ リソース インデックス (.pri) ファイルにデプロイします。 その結果、UWP アプリでは、優先カルチャのリソースが見つからない場合、次のいずれかの条件下でMissingManifestResourceExceptionが発生します。
- アプリに .pri ファイルが含まれていないか、.pri ファイルを開けませんでした。
- アプリの .pri ファイルには、指定されたルート名のリソース セットが含まれていません。
.NET