Ответ 1
Мне пришло в голову, что я неправильно справляюсь с проблемой.
Моя проблема, по сути, не существует, если это всего лишь один процесс, содержащий весь код вместе. Однако проблема заключается в том, что мой проект имеет исполняемый файл, который пытался установить связь с другим. У меня на самом деле никогда не было способа для моего helper.exe правильно поговорить с моим main.exe.
Что я узнал из этого, так это то, что процессы пытались разговаривать друг с другом без какого-либо доступа к общим адресам. Они живут в отдельных адресных пространствах, поэтому всякий раз, когда мой helper.exe пытался выполнить эту часть javascript, принадлежащую Main.exe, он пытался выполнить script в неинициализированной версии браузера, который принадлежал его собственному адресному пространству и не main.exe.
Итак, как я решил эту проблему? Я должен был включить важную часть, которая позволила процессу helper.exe поговорить с процессом main.exe. Поскольку я googled, как процессы могут говорить друг с другом, я узнал о MemoryMappedFiles. Поэтому я решил реализовать простой пример в моей программе, который позволяет Helper.exe отправлять сообщения в Main.exe.
Вот пример. Это файл, который я создал под названием "MemoryMappedHandler.cs"
public class MemoryMappedHandler
{
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("mmf1", 512);
MemoryMappedViewStream stream;
MemoryMappedViewAccessor accessor;
BinaryReader reader;
public static Message message = new Message();
public MemoryMappedHandler()
{
stream = mmf.CreateViewStream();
accessor = mmf.CreateViewAccessor();
reader = new BinaryReader(stream);
new Thread(() =>
{
while (stream.CanRead)
{
Thread.Sleep(500);
message.MyStringWithEvent = reader.ReadString();
accessor.Write(0, 0);
stream.Position = 0;
}
}).Start();
}
public static void PassMessage(string message)
{
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("mmf1"))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, 512))
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(message);
}
}
}
catch (FileNotFoundException)
{
MessageBox.Show("Cannot Send a Message. Please open Main.exe");
}
}
}
Это скомпилировано в dll, которое могут использовать как Main.exe, так и Helper.exe.
Helper.exe использует метод PassMessage() для отправки сообщения в файл с памятью, называемый "mmf1". Main.exe, который должен быть открыт в любое время, заботится о создании этого файла, который может получать сообщения из Helper.exe. Я отправляю это сообщение классу, который содержит это сообщение, и каждый раз, когда он его получает, он активирует событие.
Вот как выглядит класс Message:
[Serializable]
public class Message
{
public event EventHandler HasMessage;
public string _myStringWithEvent;
public string MyStringWithEvent
{
get { return _myStringWithEvent; }
set
{
_myStringWithEvent = value;
if (value != null && value != String.Empty)
{
if (HasMessage != null)
HasMessage(this, EventArgs.Empty);
}
}
}
}
Наконец, мне пришлось инициализировать Message в моем классе WebBrowserWindow следующим образом:
public partial class WebBrowserWindow : Window
{
public WebBrowserWindow()
{
InitializeComponent();
webBrowser.MenuHandler = new ContextMenuHandler();
webBrowser.RequestHandler = new RequestHandler();
MemoryMappedHandler.message.HasMessage += Message_HasMessage;
}
private void Message_HasMessage(object sender, EventArgs e)
{
ExecuteJavaScript(MemoryMappedHandler.message.MyStringWithEvent);
}
public void ExecuteJavaScript(string message)
{
//webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");
//webBrowser.ExecuteScriptAsync("alert('test');");
}
}
И теперь это позволяет мне выполнить javascript, который мне нужен, отправив сообщение из Helper.exe в файл Main.exe.