0

以下代码仅在作为 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;
}

这是我尝试实施这个建议,但似乎我做错了什么。此外,脚本不会总是抛出异常。我已经测试了几个页面,它们都运行良好,除了这个站点

异常发生在Type type = (((IHTMLDocument)document).Script).GetType();一行中(记录的最后一件事是“Will get type”)。

我尝试运行的脚本是页面上尚不存在的脚本(基本上是测试脚本是否存在,如果不存在,那么我会将脚本注入页面)。

知道我做错了什么吗?

4

0 回答 0