1. ホーム
  2. syntax-highlighting

[解決済み] AvalonEditのシンタックスファイル(.xshd)を作成し、アセンブリに埋め込むにはどうすればよいですか?

2022-02-07 02:54:14

質問内容

AvalonEditのカスタムハイライトルールを定義しようとしています。これに関するドキュメントはないようです。 ファイルフォーマットに関するドキュメント しかし、一度作成した定義を実際にロードして使用する方法については何も書かれていません。

は、" シンタックスハイライト Wikiページ(古いWinForms TextEditor用)には、ディスク上の.xshdファイルからハイライト定義をロードする方法が書かれていますが、私はむしろAvalonEditがその組み込み定義で行うのと同じように、リソースとしてそれを埋め込みたいと考えています。

ICSharpCode.AvalonEditプロジェクトで内蔵の蛍光ペンをロードするコードを見ましたが、実際の "リソースからロード" のコードは DefaultHighlightingManager.LoadHighlighting で行われ、これはプライベートであり、さらに奇妙なことに、明らかにリリースビルドでのみ呼び出されるようです。

プライベートメソッドからコードをコピー&ペーストして、うまくいくかどうかわからないが、質問してみる価値はありそうだ。 これを行うための標準的な方法は何ですか? サードパーティのコードがリソースからハイライトの定義を読み込むための推奨される方法はありますか?


ダニエルの答え しかし、GetManifestResourceStreamに渡す文字列に名前空間名を含める必要があります。そうしないと、NullReferenceExceptionが発生します(Nullストリームを返すため)。

結局、ResourceLoader という静的クラスを .xshd ファイルと同じプロジェクトフォルダーに追加し、このメソッドを使用することにしました。

public static IHighlightingDefinition LoadHighlightingDefinition(
    string resourceName)
{
    var type = typeof(ResourceLoader);
    var fullName = type.Namespace + "." + resourceName;
    using (var stream = type.Assembly.GetManifestResourceStream(fullName))
    using (var reader = new XmlTextReader(stream))
        return HighlightingLoader.Load(reader, HighlightingManager.Instance);
}

を呼び出せばいいのです。 ResourceLoader.LoadHighlightingDefinition("Name.xshd") .

.xshd ファイルは、ビルドアクションを Embedded Resource に設定する必要があります。

解決するには?

クラス内の静的メソッドを使用することができます。 ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader を使用して、.xshd ファイルを読み込むことができます。 例えば

using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) {
    using (XmlTextReader reader = new XmlTextReader(s)) {
        textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
    }
}

AvalonEdit 自体の読み込みコードが変で、デバッグビルドでは xshds を熱心に読み込みますが、リリースビルドでは遅延して読み込みます(そのため、その中のエラーにすぐ気がつきます)。