在问我的问题之前,我应该承认我对 .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);
尽管前三个变量已正确填充,但调用Evaluate
失败并出现异常“尝试读取或写入受保护的内存。”。我倾向于认为问题在于我的代码编组字符串值的方式,因为我在尝试使用表达式参数的编组类型时看到了不同的异常消息。
似乎我不是唯一遇到此问题的人,如本论坛帖子所示,但我无法理解我的实现与 GeckoFx 库中的许多其他工作示例有何不同。
任何想法将不胜感激。
谢谢,蒂姆。