web-dev-qa-db-ja.com

MissingManifestResourceExceptionの意味とその修正方法

状況:

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

次のメッセージを含むMissingManifestResourceExceptionが表示されます。

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

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

142
Timwi

この問題を解決するために必要なことは、ソリューションエクスプローラーで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"に変更する必要がありました。私はこれを手動で行いましたが、カスタムツールを実行しても同様にうまくいきます。

229
Timwi

今日この問題に出くわしましたが、実際に問題を回避できた このMicrosoftヘルプとサポートページ が見つかりました。

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

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

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

その後、上記のリンクに出くわしました。

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

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

34
Mark Rushakoff

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

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

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

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

27
Motti

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

ただし、。resxファイルのPropertiesになったため、正しい方向に導かれました。ここで、問題を引き起こさない別の。resxファイルとの違いに気付きました。

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

理由についての私の推測は、別のアプリケーションから使用されたライブラリに。resxがあったことです。私のアプリケーションには独自の。resxファイルがなかったので、ライブラリからのものを使用する必要がありました。 。

15
BlaM

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

  • ビルドアクション:Embedded Resource
  • 出力ディレクトリにコピー:コピーしない
  • カスタムツール:ResXFileCodeGenerator
  • カスタムツールネームスペース:My.Project.S.Proper.Namespace
11

参照: 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'が見つかりません。」

3
nietras

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

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

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

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

「System.Resources.MissingManifestResourceException」タイプの最初のチャンスの例外。

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

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

3
bigfoot

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

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

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

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

これが役立つことを願っています

2
Smith

それが人々を助けるかどうかはわかりませんが、これは私のために働いた:

したがって、私が抱えていた問題は、次のメッセージが表示されていたことです。

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

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

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

その後、実行してください、私にとってこれ以上のエラーはありません...

2
codingismylife

BlaMから提供されたソリューションは私にも役立ちました。

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

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

それでおしまい! :)

2
Jiten

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

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

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

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

1
stormtrooper

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

私の問題は、メインウィンドウがないWPFプロジェクトからメインウィンドウを削除したときに、App.xamlからStartupUriを削除するのを忘れたことでした。 StartupUriに間違いがあるとこの例外が発生する可能性があるため、誰かがこれに苦労している場合は、App.xamlStartupUriを確認してください。

1
Archeg

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

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

1
Winston

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

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

0
franckspike

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

0
KCT

言うまでもありません。定数またはリテラルを使用する場合は、ProjectName.Resourcesという形式のリソースを参照し、Resources.resxをcpntainしないことを確認してください。

それはあなたを1時間か2時間節約できます。

0
Herb

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

0
Markive