我试图使用C#将一个WebView2对象传递给AddHostObjectToScript
。在没有成功地从webview检索对象之后,我使用了调试器,发现AddHostObjectToScript
调用永远不会完成。
下面是完整的代码片段:
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class Example
{
public string Prop { get; set; } = "example";
}
namespace Example_UWP
{
public sealed partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
InitializeAsync();
}
public async Task InitializeAsync()
{
await ExampleView.EnsureCoreWebView2Async();
ExampleView.Source = new Uri("http://localhost:3000");
ExampleView.CoreWebView2.OpenDevToolsWindow();
ExampleView.CoreWebView2.AddHostObjectToScript("example", new Example());
}
}
}
因此,example
对象在chrome.webview.hostObjects
或chrome.webview.hostObjects.sync
中不可用。函数引发以下错误:
组或资源未处于执行请求操作的正确状态。
我尝试过不同的方法,但都没有成功,例如:
InitializeAsync
Example
实例的引用,以避免在事件NavigationCompleted
添加宿主对象之前和之后添加主机对象。H 220F 221
我使用的是Microsoft.Web.WebView2版本1.0.1264.42
发布于 2022-10-16 18:48:52
为了与第三方库进行交互,需要向您的解决方案添加一个非常特定的C++项目,即Windows组件(C++/WinRT),该解决方案必须称为WinRTAdapter。
接下来,您必须从名为C++的NuGet安装一个库到您的Microsoft.Web.WebView2
项目。
完成此操作后,您必须将第三方库作为参考。
接下来,转到您的C++项目属性,转到公共属性并选择WebView2
在这里,您必须做四个更改:
No.
E 233
并添加以下内容:H 234F 235
Windows.System.UserProfile
Windows.Globalization.Language
CallJSInterface
CallJSInterface是我的第三方名称空间的名称。
单击OK并构建C++库。
在构建了C++ lib (WinRTAdapter)之后,必须将其作为参考添加到主项目中。
现在,我们需要做一些更改,以便能够调用第三方库中的函数。第一个是注册它。我们在相同的LoadLocalPage()
函数中执行此操作,这是在NavigationCompleted上进行的:
var namespacesName = "CallJSInterface";
var dispatchAdapter = new WinRTAdapter.DispatchAdapter();
core_wv2.AddHostObjectToScript(namespacesName, dispatchAdapter.WrapNamedObject(namespacesName, dispatchAdapter));
其中CallJSInterface
是您的命名空间。之后,您需要像这样在JS中注册您的函数:
var callJS;
if (chrome && chrome.webview) {
chrome.webview.hostObjects.options.defaultSyncProxy = true;
chrome.webview.hostObjects.options.forceAsyncMethodMatches = [/Async$/];
chrome.webview.hostObjects.options.ignoreMemberNotFoundError = true;
window.CallJSInterface = chrome.webview.hostObjects.sync.CallJSInterface;
callJS = new CallJSInterface.CallJSCSharp();
}
CallJSInterface
再次出现在您的命名空间中。现在,您可以像这样调用JS ( async()
是强制性的):
callJS.async().KeepScreenOn()
如果你需要更多细节,我在我的网站上有一个完整的教程:
https://supernovaic.blogspot.com/2022/10/from-webview-to-webview2-in-uwp.html
https://stackoverflow.com/questions/73610413
复制相似问题