以下代码仅在作为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();
行(记录的最后一件事是“将获取类型”)。
我试图运行的脚本是一个在页面上不存在的脚本(基本上是一个测试,看看脚本是否存在,如果没有,那么我会将脚本注入页面)。
知道我做错了什么吗?