この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
MissingManifestResourceException例外は、.NET アプリと UWP アプリのさまざまな理由でスローされます。
.NET アプリ
.NET アプリでは、ニュートラル カルチャのリソース セットを特定のアセンブリから読み込めなかったため、リソースの取得が失敗すると、 MissingManifestResourceException がスローされます。 特定のリソースを取得しようとすると例外がスローされますが、リソースを見つける失敗ではなく、リソース セットを読み込めませんでした。
注
詳細については、 ResourceManager クラストピックの「MissingManifestResourceException 例外の処理」セクションを参照してください。
例外の主な原因は次のとおりです。
リソース セットは、その完全修飾名で識別されません。 たとえば、ResourceManager.ResourceManager(String, Assembly) メソッドの呼び出しの
baseName
パラメーターが、名前空間を持たないリソース セットのルート名を指定しているが、そのアセンブリに格納されるときにリソース セットに名前空間が割り当てられている場合、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
という名前が付けられ、ResourceManager.ResourceManager(String, Assembly) コンストラクターのbaseName
パラメーターに (GlobalResources
ではなく)GlobalResources.resources
の値を指定すると、この例外がスローされます。メソッド呼び出しで識別されるカルチャ固有のリソース セットが見つからないので、フォールバック リソース セットを読み込めません。 たとえば、英語 (米国) とロシア (ロシア) のカルチャ用にサテライト アセンブリを作成しても、ニュートラル カルチャのリソース セットを指定できない場合、アプリの現在のカルチャが英語 (英国) の場合、この例外がスローされます。
MissingManifestResourceException は、値が0x80131532を持つ HRESULT COR_E_MISSINGMANIFESTRESOURCE
を使用します。
MissingManifestResourceException では、参照の等価性をサポートする既定の Equals 実装が使用されます。
MissingManifestResourceExceptionのインスタンスの初期プロパティ値の一覧については、MissingManifestResourceExceptionコンストラクターを参照してください。
注
サテライト アセンブリが使用できない場合にアプリが失敗しないように、メイン アセンブリにはニュートラル なリソース セットを含めるようにすることをお勧めします。
ユニバーサル Windows プラットフォーム (UWP) アプリ
UWP アプリは、ニュートラル カルチャを含む複数のカルチャのリソースを 1 つのパッケージ リソース インデックス (.pri) ファイルにデプロイします。 その結果、UWP アプリでは、優先カルチャのリソースが見つからない場合は、次のいずれかの条件下で MissingManifestResourceException がスローされます。
- アプリに .pri ファイルが含まれていないか、.pri ファイルを開けませんでした。
- アプリの .pri ファイルには、指定されたルート名のリソース セットが含まれていません。
.NET