162

状況:

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

MissingManifestResourceExceptionのメッセージが表示されます。

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

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

4

26 に答える 26

257

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

于 2009-08-25T17:09:51.227 に答える
38

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

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

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

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

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

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

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

于 2009-09-02T14:36:53.727 に答える
36

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

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

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

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

于 2010-12-01T12:50:13.623 に答える
18

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

ただし、.resxファイルの [プロパティ] にたどり着いたため、正しい方向に導かれました。ここで、問題のない別の.resxファイルとの違いに気付きました。

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

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

于 2010-09-08T09:58:23.640 に答える
4

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

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

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

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

タイプ 'System.Resources.MissingManifestResourceException' の最初の例外です。

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

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

于 2015-02-18T19:56:30.560 に答える
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'が見つかりません」 。」

于 2012-12-19T15:02:31.987 に答える
2

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

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

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

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

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

于 2016-08-12T09:03:24.130 に答える
1

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

そのため、resx ファイルを削除して再生成しました。今は大丈夫です。

于 2011-04-08T18:12:32.633 に答える
1

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

私の問題は、WPF プロジェクト (メイン ウィンドウがない) からメイン ウィンドウを削除したときに、から削除するのを忘れていたことStartupUriですApp.xaml。に間違いがあると、この例外が発生する可能性があると思いStartupUriます。StartupUriApp.xaml

于 2016-01-08T09:15:01.777 に答える
1

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

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

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

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

于 2018-01-26T03:06:41.393 に答える
0

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

于 2013-04-29T03:37:49.277 に答える
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 のバージョンを確認する必要があります。

于 2018-01-24T12:14:57.917 に答える
0

CMake を使用して C# プロジェクトを生成しているときにこれが発生した場合は、私が見つけた解決策が役立つ場合があります。

CMakeLists.txt ファイルが必要です

set_property(TARGET yourTargetName PROPERTY VS_GLOBAL_RootNamespace yourRootNamespace)

yourTargetNameとを独自の値に置き換えてくださいyourRootNamespace

次に、リソースがアセンブリに埋め込まれます!

于 2021-09-01T14:01:50.297 に答える
-3

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

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

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

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
于 2009-08-25T11:45:37.060 に答える