Я реализовал это в нескольких приложениях в прошлом, вот как: (Примечание: приведенный ниже пример не готов к работе и должен использоваться только в качестве руководства).
Сначала создайте обычный класс .NET (public), который содержит публичные методы, которые вы хотите вызывать из Javasvcipt, запущенного в вашем элементе управления веб-браузера.
Самое главное, он должен быть украшен атрибутом ComVisible (true)] из пространства имен System.Runtime.InteropServices (Javascript в IE основан на COM). Это можно назвать как угодно, я назвал это «Внешним», чтобы прояснить ситуацию.
using System.Runtime.InteropServices;
[ComVisible(true)]
public class External
{
private static MainWindow m_mainWindow = null;
public External(MainWindow mainWindow)
{
m_mainWindow = mainWindow;
}
public void CloseApplication()
{
m_mainWindow.Close();
}
public string CurrentDate(string format)
{
return DateTime.Now.ToString(format);
}
}
Затем в форме .NET, содержащей ваш элемент управления веб-браузера, создайте экземпляр класса COMVisible, затем установите для элемента управления веб-браузера ObjectForScripting этот экземпляр:
private void MainWindow_Load(object sender, EventArgs e)
{
m_external = new External(this);
browserControl.ObjectForScripting = m_external;
}
Наконец, в вашем Javascript, запущенном в элементе управления веб-браузера, вы получаете доступ к методам .NET через объект window.external. В этом случае window.external фактически ссылается (косвенно через оболочку взаимодействия COM) на созданный выше «внешний» объект:
// Javascript code
function CloseButton_Click()
{
if (window.external)
{
window.external.CloseApplication();
}
}
Имейте в виду, что вызовы из Javascript в .NET проходят через уровень взаимодействия COM, и поэтому должен выполняться запрос интерфейса по умолчанию, сортировка параметров и т. Д. Другими словами, это может быть относительно МЕДЛЕННО, поэтому проведите некоторое тестирование производительности, если вы планируете сделать несколько вызовов, например, из цикла.
Кроме того, просто для дальнейшего использования вызов кода Javascript из .NET проще, просто используйте метод Document.InvokeScript:
browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });