web-dev-qa-db-ja.com

GetManifestResourceStream()でマニフェストリソースをロードできません

XSDを使用してカスタム構成セクションを作成しました。この新しいスキーマに続く構成ファイルを解析するために、次のようにリソース(私の.xsdファイル)をロードします。

public partial class MonitoringConfiguration
    {
        public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd";
        public const string ConfigSchema = "urn:MonitoringConfiguration-1.0";

        private static XmlSchemaSet xmlSchemaSet;

        static MonitoringConfiguration()
        {
            xmlSchemaSet = new XmlSchemaSet();
            Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
            XmlReader schemaReader = XmlReader.Create(xsdStream);
            xmlSchemaSet.Add(ConfigSchema, schemaReader);
        }

    }

ところで、私のリソースはMonitoringConfiguration.xsdです。そして、他の部分クラス(.xsdファイルのコードビハインドを表す)の名前空間はMonitoringAPI.Configuration

問題は次の場所にあります。

 Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);

XsdStreamはnullであるため、リソースが見つかりません。しかし、なぜ?

ありがとうございました

46

リソースの名前は常に次のとおりです。

<Base namespace>.<RelativePathInProject>.<FileName>

したがって、リソースが「Resources/Xsd /」にあり、デフォルトのプロジェクト名前空間が「MonitoringAPI.Configuration」である場合、リソース名は次のようになります。

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

また、リソースのビルドアクションが「Embedded Resource」に設定されていることを確認してください

92

埋め込みリソースの実際の名前を取得する簡単で正しい方法:

string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();

次に、resourceNames配列を確認するだけで、GetManifestResourceStreamメソッドに何を渡すかを確実に知ることができます。

51
user1958681

私の場合、

GetManifestResourceStream()を介してファイルにアクセスしようとしたとき。ファイルの無効なパスが原因でエラーが発生し、ストリームはnullになります。

解決策:

ソリューションに追加したファイルを右クリックし、[プロパティ]をクリックします。

を選択 Build Action なので Embedded Resource。 (Contentの代わりに-デフォルトで)

Build action property set to embedded resource

12
RajeshKdev

デフォルトでは、Visual Studioはxsdファイルを埋め込みません。したがって、xsdファイルの[ビルドアクション]プロパティが[埋め込みリソース]に設定されていることを確認して動作させる必要があります。

8
Huy Thai

form1.resxの下にリソースを追加します->既存のアイテムを追加します

resources folder.goでプロパティに追加したリソースをダブルクリックし、noneではなく「Embedded Resources」を選択します。

次に、行のデバッグを試行します。

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();

追加したリソースがアレイ内にあることを確認してください。次に、この配列からリソース名を正確にコピーし、コードに名前を付けてみてください。

5
Rittika

以下のリソース名を渡すことで、リソースストリームを取得できます...

  1. リソース名を取得します。

    アセンブリobjAssembly = Assembly.GetExecutingAssembly();

    string [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. リソース名を...に渡します.

    ストリームstrm = objAssembly.GetManifestResourceStream(strResourceNames);

これで、必要なことを何でもできるStreamができました...

1
Sanjay Dwivedi

多くの異なるアセンブリに.xsdファイルのヒープ全体を埋め込むという問題がありました。 1つを除いて、すべてが機能していました(GetManifestResourceNamesが表示されるはずのファイルを返していました)。そうではなかったものは呼ばれました:

Something.LA.xsd

私は特定のカルチャを扱っておらず、ファイル名の最後にある.LAビットがコンパイラによってピックアップされていました。このファイルはLAカルチャ用であるためです-マニフェストのファイル名はSomething.xsd(カルチャーの下LA)-したがって、私はそれを見つけることができません(最終的に衛星会議になりました)。ファイルの名前を変更することで問題を回避しました-おそらく、特定の埋め込みリソースの文化を明示的に述べることが可能です。

実際には、簡単なグーグルが明らかにします: 埋め込みファイルのファイルカルチャがファイル名に基づいて設定されるのを防ぐにはどうすればよいですか

この答えによれば、あなたはハックなことをしなければならない-だからおそらくファイルの名前を変更することはそれほど悪くはなかった:)

0
GHC

私の場合、それは完全に異なるものでした:

私のUWPアプリはデバッグおよびリリース構成で正しくコンパイルされましたが、GetManifestResourceStreamはNullのみのリリース構成を返しました。

問題は、UWPビルド構成ファイル(およびそこにのみ)で、設定"。NETネイティブツールチェーンでコンパイル"が有効になっていたことでした。無効にした後、GetManifestResourceStreamは期待どおりに機能しました。

0
Marcus