1

アプリケーションにXMLリソースを埋め込んでいますが、XSDファイルの読み込みは機能しますが、XMLファイルの読み込みは機能しません。これがXSDファイルをロードする方法です。

    private static XmlSchema LoadXsdResource(string folder, string xsdName)
    {
        string filename = string.Format("Namespace.{0}.{1}.xsd", folder, xsdName);
        using (Stream stream = Assembly.GetCallingAssembly().GetManifestResourceStream(filename))
        {
            return XmlSchema.Read(stream, (o, e) =>
            {
                log.Warn(string.Format("Napaka pri parsanju XSD sheme {0}: {1}: {2}", e.Severity, e.Message, filename));
            });
        }
    }

他の場所でXMLをロードします。

XDocument xdoc = XDocument.Load(Assembly.GetCallingAssembly().GetManifestResourceStream("Namespace.Resources.Oddaja.xml"));

これも機能しますが、コンパイルされたアセンブリを実行した場合に限ります。デバッガーで実行すると、NullReferenceExceptionから取得しGetManifestResourceStream()ます。

だから私はそれを名前空間で台無しにしましたよね?いいえ、チェックしてダブルチェックしました。名前空間は正しいですが、そうでない場合は、実行中のアセンブリで例外が発生します。(例外が発生するたびにログに記録します)また、.NET Reflectorを再確認して、期待する名前のリソースが実際に存在することを確認しました。

また、トリプルチェックを行い、Build Actionがに設定されていることを確認しましたEmbedded Resourceが、何も機能しませんでした。デバッガーの外部でexeを実行すると正常に動作し、XMLをイベント印刷できますただし、デバッガーで実行すると、nullが返され、プログラムがクラッシュします。

GetManifestResourceStream()デバッグ時にのみnullを返す原因は何ですか?

4

3 に答える 3

3

問題は、からコードを実行していたことでしたMain()Assembly.GetCallingAssembly()州の文書:

現在実行中のメソッドを呼び出したメソッドのアセンブリを返します。

私のメソッドAssemblyを呼び出したMain()のはもちろんデバッガーです。デバッガーに必要なリソースがなく、クラッシュしました。このLoadXsdResource()メソッドは、呼び出し元のアセンブリが私のものであり、必要なリソースを持っているために機能します。

私が欲しかったのはAssembly.GetExecutingAssembly()

現在実行中のコードを含むアセンブリを取得します。

もし私が自分のコードをクラスに入れていたら、これは起こらなかっただろう。私は愚かであるために税金を払ったと思います。

于 2013-01-18T12:30:56.497 に答える
1

Assembly.GetCallingAssembly()は確かに問題です。デバッグ中、コードは Visual Studio ホスティング プロセスによって呼び出されますyourapp.vshost.exe。もちろん、あなたのリソースは含まれていません。

回避策は、[プロジェクト] + [プロパティ] の [デバッグ] タブで、[Visual Studio ホスティング プロセス オプションを有効にする] のチェックを外します。しかしもちろん、本当の解決策は、コードの場所とリソースの場所にもっと注意を払いGetExecutingAssembly()、最も可能性の高い正しい選択をすることです。

于 2013-01-18T13:52:03.300 に答える