gpt4 book ai didi

javascript - 使用 CefSharp WPF 在 C# 上执行 JavaScript 会导致错误

转载 作者:可可西里 更新时间:2023-11-01 02:24:48 25 4
gpt4 key购买 nike

每当我尝试使用 CefSharp(稳定版 57.0)通过 C# 执行 JavaScript 时,我都会收到错误消息。我只是想执行警报功能,所以我可以确保它有效,然后用我自己的功能对其进行测试。但是,我似乎在尝试这样做时遇到了错误。

public partial class WebBrowserWindow : Window
{
public WebBrowserWindow()
{
InitializeComponent();
webBrowser.MenuHandler = new ContextMenuHandler();
webBrowser.RequestHandler = new RequestHandler();
}

//Trying to execute this with either method gives me an error.
public void ExecuteJavaScript()
{
//webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");

//webBrowser.ExecuteScriptAsync("alert('test');");
}
}

我已经尝试了两种执行脚本的方式。

第一个:

webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");

给我这个错误:

enter image description here

第二个:

webBrowser.ExecuteScriptAsync("alert('test');");

给我这个错误:

enter image description here

我的目标是创建一个可以在我的 CefSharp 浏览器中执行 JavaScript 函数的 C# 函数。

我尝试了很多链接/引用,但堆栈溢出的链接/引用并不多。我还读了The FAQ for CefSharp找不到任何简单的例子让我通过 C# 随意执行 JavaScript。

此外,我还验证了框架加载(完成加载)和卸载(未卸载)的事件,以及网络浏览器是否为空(事实并非如此),以及来自以下内容的消息:

webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");

仍然会导致第一个错误发生。

我测试了 GetMainFrame()。它总是返回空值。总是。无论我等待多长时间,或者我检查什么条件。

重要

我忘了添加一条重要信息,我的项目中有 2 个程序集。它们都编译成单独的可执行文件:

助手.exe主程序

main.exe 有一个窗口“CallUI”,当单击按钮时,它会执行我创建的方法“ExecuteJavaScript()”,该方法位于我的窗口“BrowserWindow”内。 CallUI 窗口在 Helper.exe 中声明和初始化。

所以基本上我尝试使用一个单独的程序打开一个窗口,单击一个调用该方法的按钮并执行 javascript。所以我认为因为它们是不同的进程,所以它告诉我浏览器为空。但是,当我在 Main.exe 中完成所有操作时,它工作正常。是否有一种解决方法允许我使用单独的进程从 Helper.exe 创建窗口并从 Main.exe 执行 Javascript?

最佳答案

我注意到我处理问题的方式不对。

事实上,如果它只是一个将所有代码放在一起的进程,那么我的问题就不存在了。但是,我的项目有一个试图与另一个项目通信的可执行文件这一事实是问题所在。实际上,我从来没有办法让我的 helper.exe 适本地与我的 main.exe 对话。

我从中了解到,进程试图在没有任何类型的共享地址访问的情况下相互交谈。它们位于不同的地址空间中,因此每当我的 helper.exe 试图执行属于 Main.exe 的 javascript 部分时,它试图在属于其自己的地址空间而不是 main 的未初始化版本的浏览器中执行脚本.exe.

那么我是如何解决这个问题的呢?我必须包括一个重要的部分,它允许 helper.exe 进程与 main.exe 进程对话。当我在 google 上搜索进程如何相互通信时,我发现了 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);
}
}
}
}

最后,我必须像这样在我的 WebBrowserWindow 类中初始化 Message:

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');");
}
}

现在它允许我通过从 Helper.exe 向 Main.exe 发送消息来执行我需要的 javascript。

关于javascript - 使用 CefSharp WPF 在 C# 上执行 JavaScript 会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44332948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com