InvokeMember的IHTMLDocument脚本抛出访问冲突异常

时间:2012-08-19 19:08:47

标签: c# winforms mshtml ihtmldocument2

以下代码仅在作为ClickOnce应用程序发布并安装后才会引发访问冲突异常。如果从Visual Studio运行它,即使我处于发布模式,也不会发生错误:

public static object InvokeScript(this IHTMLDocument2 document, string scriptName, object[] args = null)
{
    FileLog.WriteLine("-------------------------------------- Will invoke script --------------------------------------");
    FileLog.WriteLine("document: " + document == null ? "NULL" : document.ToString());
    FileLog.WriteLine("scriptName: " + scriptName);
    FileLog.WriteLine("args: " + (args == null ? "NULL" : string.Join(", ", args.Select(a => a == null ? "NULL" : a.ToString()))));
    FileLog.WriteLine("Stack: " + GetStack());
    object result = null;
    try
    {
        Type type = GetType(document);
        result = Invoke(document, scriptName, args, result, type);
    }
    catch (Exception ex)
    {
        if (IsSecurityOrCriticalException(ex))
        {
            throw;
        }
    }
    FileLog.WriteLine("-------------------------------------- Invoked script --------------------------------------");
    return result;
}

private static object Invoke(IHTMLDocument2 document, string scriptName, object[] args, object result, Type type)
{
    FileLog.WriteLine("Will Invoke");
    result = type.InvokeMember(scriptName, System.Reflection.BindingFlags.InvokeMethod, null, ((IHTMLDocument)document).Script, args);
    FileLog.WriteLine("Invoked");
    return result;
}

private static Type GetType(IHTMLDocument2 document)
{
    FileLog.WriteLine("Will get type");
    Type type = (((IHTMLDocument)document).Script).GetType();
    FileLog.WriteLine("Got type");
    return type;
}

这是我尝试实施this suggestion,但似乎我做错了。此外,该脚本不会总是抛出异常。我已经测试了几个页面,除了this site之外,它们都运行良好。

异常发生在Type type = (((IHTMLDocument)document).Script).GetType();行(记录的最后一件事是“将获取类型”)。

我试图运行的脚本是一个在页面上不存在的脚本(基本上是一个测试,看看脚本是否存在,如果没有,那么我会将脚本注入页面)。

知道我做错了什么吗?

0 个答案:

没有答案