質問をする前に、.NET相互運用に関する知識が乏しいことを認める必要があります。そのため、初心者のミスを犯している可能性があることに気づきました。
GeckoFxライブラリを使用して、埋め込まれたGecko(Firefox)ブラウザーインスタンスを含むC#アプリケーションを作成しています。このアプリは、元の形式のGeckoFxを使用して正常に動作しますが、MozillansIDOMXPathEvaluator
インターフェイスを使用して、XPathクエリをサポートするように拡張する必要があります。
GeckoFxコードベースには、基盤となるマネージドGeckoインターフェイスを公開および使用する例が多数含まれています。同じコードパターンに従って、いくつかの新しいインターフェイスを公開しました。
[Guid("75506f8a-b504-11d5-a7f2-ca108ab8b6fc"),
ComImport,
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsIDOMXPathEvaluator
{
nsIDOMXPathExpression CreateExpression(
[MarshalAs(UnmanagedType.LPWStr)] string expression,
nsIDOMXPathNSResolver resolver);
nsIDOMXPathNSResolver CreateNSResolver(
nsIDOMNode nodeResolver);
nsISupports Evaluate(
[MarshalAs(UnmanagedType.LPWStr)] string expression,
nsIDOMNode contextNode,
nsIDOMXPathNSResolver resolver,
ushort type);
}
[Guid("ce600ca8-e98a-4419-ad61-2f6d0cb0ecc8"),
ComImport,
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsIDOMXPathExpression
{
nsISupports Evaluate(
nsIDOMNode contextNode,
ushort type,
nsISupports result);
}
[Guid("75506f83-b504-11d5-a7f2-ca108ab8b6fc"),
ComImport,
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsIDOMXPathNSResolver
{
string LookupNamespaceUri(
[MarshalAs(UnmanagedType.LPWStr)] string prefix);
}
新しいインターフェイスを公開しnsIDOMXPathEvaluator
た状態で、ロードされたDOMのコンテキストでXPath式を評価するために使用しようとします。
var evaluator = Xpcom.CreateInstance<nsIDOMXPathEvaluator>("@mozilla.org/dom/xpath-evaluator;1");
var node = (nsIDOMNode)Document.DocumentElement.DomObject;
var resolver = evaluator.CreateNSResolver(node);
var result = evaluator.Evaluate("//div[0]", node, resolver, 0);
最初の3つの変数は正しく入力されていますが、の呼び出しはEvaluate
「保護されたメモリの読み取りまたは書き込みを試みました」という例外を除いて失敗します。マーシャリングされたタイプの式パラメーターを試したときにさまざまな例外メッセージが表示されたため、コードが文字列値をマーシャリングする方法に問題があると考える傾向があります。
このフォーラムの投稿に示されているように、この問題に苦しんでいるのは私だけではないようですが、私の実装がGeckoFxライブラリの他の多くの実用的な例とどのように異なるかを理解できません。
任意のアイデアをいただければ幸いです。
ありがとう、ティム。