InvalidCastException при чтении свойства mshtml.HTMLDocument.Script
Попытка прочитать свойство mshtml.HTMLDocument приводит к следующему исключению:
В mscorlib.dll возникло необработанное исключение типа "System.InvalidCastException". Дополнительная информация: указанное приведение недопустимо. произошло
Это происходит в строке "object script = doc.Script;"
Код:
using System;
using System.Reflection;
using mshtml;
using SHDocVw;
namespace ConsoleApp12
{
class Program
{
static void Main(string[] args)
{
string command = string.Empty;
while (command != "exit")
{
Console.Write("Enter command: ");
command = Console.ReadLine();
if (command == "go")
{
ShellWindows shellWindows = new SHDocVw.ShellWindows();
foreach (var shellWindow in shellWindows)
{
var ie = shellWindow as SHDocVw.InternetExplorer;
if (ie != null)
{
var doc = ie.Document as HTMLDocument;
if (doc != null)
{
if (doc.title.Contains("Test Page"))
{
object script = doc.Script;
script.GetType().InvokeMember("DoSomething", BindingFlags.InvokeMethod, null, script, null);
}
}
}
}
}
else
{
Console.WriteLine("Unrecognized command");
}
}
}
}
}
Вот тестовая страница, которую я использую:
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<script>
function sayHello()
{
alert('Hello');
}
</script>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>
и вот мои ссылки на проекты:
<Reference Include="Interop.SHDocVw">
<HintPath>..\..\..\TestApp\lib\Interop.SHDocVw.dll</HintPath>
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<EmbedInteropTypes>False</EmbedInteropTypes>
</Reference>
1 ответ
Оказывается, все, что мне нужно было сделать, это запустить его как однопоточную квартиру. Этот ответ дал мне подсказку, в которой я нуждался: /questions/38889351/c-ukazannoe-privedenie-nedopustimo-pri-naznachenii-mshtmlhtmldocumentframes/38889366#38889366
using System;
using System.Reflection;
using System.Threading;
using mshtml;
using SHDocVw;
namespace ConsoleApp12
{
class Program
{
static void Main(string[] args)
{
string command = string.Empty;
while (command != "exit")
{
Console.Write("Enter command: ");
command = Console.ReadLine();
if (command == "go")
{
Thread thread = new Thread(() =>
{
ShellWindows shellWindows = new SHDocVw.ShellWindows();
foreach (var shellWindow in shellWindows)
{
var ie = shellWindow as SHDocVw.InternetExplorer;
if (ie != null)
{
var doc = ie.Document as HTMLDocument;
if (doc != null)
{
if (doc.title.Contains("Test Page"))
{
object script = doc.Script;
script.GetType().InvokeMember("sayHello", BindingFlags.InvokeMethod, null, script, null);
}
}
}
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
else
{
Console.WriteLine("Unrecognized command");
}
}
}
}
}