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であるため、リソースが見つかりません。しかし、なぜ?
ありがとうございました
リソースの名前は常に次のとおりです。
<Base namespace>.<RelativePathInProject>.<FileName>
したがって、リソースが「Resources/Xsd /」にあり、デフォルトのプロジェクト名前空間が「MonitoringAPI.Configuration」である場合、リソース名は次のようになります。
"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"
また、リソースのビルドアクションが「Embedded Resource」に設定されていることを確認してください
埋め込みリソースの実際の名前を取得する簡単で正しい方法:
string[] resourceNames =
Assembly.GetExecutingAssembly().GetManifestResourceNames();
次に、resourceNames配列を確認するだけで、GetManifestResourceStreamメソッドに何を渡すかを確実に知ることができます。
デフォルトでは、Visual Studioはxsdファイルを埋め込みません。したがって、xsdファイルの[ビルドアクション]プロパティが[埋め込みリソース]に設定されていることを確認して動作させる必要があります。
form1.resxの下にリソースを追加します->既存のアイテムを追加します
resources folder.goでプロパティに追加したリソースをダブルクリックし、noneではなく「Embedded Resources」を選択します。
次に、行のデバッグを試行します。
string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();
追加したリソースがアレイ内にあることを確認してください。次に、この配列からリソース名を正確にコピーし、コードに名前を付けてみてください。
以下のリソース名を渡すことで、リソースストリームを取得できます...
リソース名を取得します。
アセンブリobjAssembly = Assembly.GetExecutingAssembly();
string [] strResourceNames = objAssembly.GetManifestResourceNames();
リソース名を...に渡します.
ストリームstrm = objAssembly.GetManifestResourceStream(strResourceNames);
これで、必要なことを何でもできるStreamができました...
多くの異なるアセンブリに.xsdファイルのヒープ全体を埋め込むという問題がありました。 1つを除いて、すべてが機能していました(GetManifestResourceNamesが表示されるはずのファイルを返していました)。そうではなかったものは呼ばれました:
Something.LA.xsd
私は特定のカルチャを扱っておらず、ファイル名の最後にある.LAビットがコンパイラによってピックアップされていました。このファイルはLAカルチャ用であるためです-マニフェストのファイル名はSomething.xsd(カルチャーの下LA)-したがって、私はそれを見つけることができません(最終的に衛星会議になりました)。ファイルの名前を変更することで問題を回避しました-おそらく、特定の埋め込みリソースの文化を明示的に述べることが可能です。
実際には、簡単なグーグルが明らかにします: 埋め込みファイルのファイルカルチャがファイル名に基づいて設定されるのを防ぐにはどうすればよいですか
この答えによれば、あなたはハックなことをしなければならない-だからおそらくファイルの名前を変更することはそれほど悪くはなかった:)
私の場合、それは完全に異なるものでした:
私のUWPアプリはデバッグおよびリリース構成で正しくコンパイルされましたが、GetManifestResourceStreamはNullのみのリリース構成を返しました。
問題は、UWPビルド構成ファイル(およびそこにのみ)で、設定"。NETネイティブツールチェーンでコンパイル"が有効になっていたことでした。無効にした後、GetManifestResourceStreamは期待どおりに機能しました。