1. ホーム
  2. c#

[解決済み] MissingManifestResourceExceptionの意味と修正方法について教えてください。

2022-05-31 21:42:52

質問

状況を教えてください。

  • というクラスライブラリを持っています。 RT.Servers というクラスライブラリがあり、いくつかのリソース (型は byte[] タイプですが、それは重要ではありません)
  • 同じクラスライブラリに、これらのリソースの1つを返すメソッドがあります。
  • その単一のメソッドを呼び出すだけの簡単なプログラム(そのライブラリへの参照を持つ)があります。

私は MissingManifestResourceException に次のようなメッセージが表示されます。

指定されたカルチャに適したリソース 指定された文化 または中立の文化に適したリソースが見つかりませんでした。 以下を確認してください。 が正しく組み込まれているか、または に正しく埋め込まれたか、またはリンクされていることを確認してください。 アセンブリに正しく埋め込まれるか、またはリンクされていることを確認してください。 または、必要なすべてのサテライトアセンブリが 必要な全てのサテライトアセンブリがロード可能であり、完全に 署名されていること。

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

どのように解決するのですか?

この問題を解決するために必要なことは、右クリックで 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" . 私はこれを手動で行いましたが、カスタム ツールを実行しても同様に行うことができました。