C# class 属性无法在 Javascript 中访问
C# class attributes not accessible in Javascript
我想通过 C# WebView-Control 在 JavaScript 中访问我的 class。
因此我使用 WebView.AddWebAllowedObject 方法。但是,如果我分配一个属性,它工作正常,但如果我分配整个 class 以获取 js 中的所有属性,所有属性(和方法 btw)都是 "undefined"。我尝试了在 www 上找到的所有内容。见附件代码:
//The class I want to make accessible
[AllowForWeb, ComVisible(true)]
[MarshalingBehavior(MarshalingType.Agile)]
public class DeviceInformation
{
public string IPAdress { get; private set; }
public DeviceInformation()
{
IPAdress = GetIPAdress();
}
public string GetDeviceUUID()
{
EasClientDeviceInformation deviceinfo = new EasClientDeviceInformation();
return deviceinfo.Id.ToString();
}
public string GetIPAdress()
{
List<string> ipAddresses = new List<string>();
var hostnames = NetworkInformation.GetHostNames();
foreach (var hn in hostnames)
{
if (hn?.IPInformation != null && (hn.IPInformation.NetworkAdapter.IanaInterfaceType == 71 ||
hn.IPInformation.NetworkAdapter.IanaInterfaceType == 6))
{
string ipadress = hn.DisplayName;
return ipadress;
}
}
return string.Empty;
}
}
此处对象已初始化。
DeviceInformation devinf = new DeviceInformation();
private void View_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
if (args.Uri.Host == "")
{
//win_ipadress has an ipadress as value
view.AddWebAllowedObject("win_ipadress", devinf.IPAdress);
//deviceInformation is initialized as well but I have no access to its attributes
view.AddWebAllowedObject("deviceInformation", devinf);
}
}
这就是我在 js 中的调用方式:
else if ($.os.ie) {
myIpAdr = window.win_ipadress;
//Throws an exception because GetIPAdress() is "undefined"
myIpAdr = window.deviceInformation.GetIPAdress();
}
我在 Windows 通用应用程序中使用它。 Javascript 并在 WebView 中显示 HTML-Code is already in use for Android an iOS.
我认为您需要定义以小写字符开头的方法名称。
例如:将GetIPAddress改为getIPAddress。
我这边测试了一下,发现如果我用大写的名字'GetIPAddress',是不行的。但是如果我使用 getIPAddress,它就可以工作。
而且我在 this 线程中阅读了 kangax 的解释后,我认为它是有道理的。
[更新]
因为你修改了方法名后还是不行,我想问题应该与你如何暴露windows运行时对象有关。我猜你只是定义了 DeviceInformation class 并试图在同一个项目中使用它。
首先,我们需要创建一个单独的windows通用windows运行时组件项目。
c# class DeviceInformation 应该放到这个项目中。保留相同的代码。
然后,在您的通用应用程序项目中,添加对 windows 运行时组件的引用并保留其余代码以使用 windows 运行时对象。
[更新 2]
刚刚注意到 VS 中的一个有趣行为。不管我们在C#中定义的方法名是大写还是小写开头,visual studio智能提示都是小写的,所以当我们在js中使用时,方法名会自动转换。
我想通过 C# WebView-Control 在 JavaScript 中访问我的 class。 因此我使用 WebView.AddWebAllowedObject 方法。但是,如果我分配一个属性,它工作正常,但如果我分配整个 class 以获取 js 中的所有属性,所有属性(和方法 btw)都是 "undefined"。我尝试了在 www 上找到的所有内容。见附件代码:
//The class I want to make accessible
[AllowForWeb, ComVisible(true)]
[MarshalingBehavior(MarshalingType.Agile)]
public class DeviceInformation
{
public string IPAdress { get; private set; }
public DeviceInformation()
{
IPAdress = GetIPAdress();
}
public string GetDeviceUUID()
{
EasClientDeviceInformation deviceinfo = new EasClientDeviceInformation();
return deviceinfo.Id.ToString();
}
public string GetIPAdress()
{
List<string> ipAddresses = new List<string>();
var hostnames = NetworkInformation.GetHostNames();
foreach (var hn in hostnames)
{
if (hn?.IPInformation != null && (hn.IPInformation.NetworkAdapter.IanaInterfaceType == 71 ||
hn.IPInformation.NetworkAdapter.IanaInterfaceType == 6))
{
string ipadress = hn.DisplayName;
return ipadress;
}
}
return string.Empty;
}
}
此处对象已初始化。
DeviceInformation devinf = new DeviceInformation();
private void View_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
if (args.Uri.Host == "")
{
//win_ipadress has an ipadress as value
view.AddWebAllowedObject("win_ipadress", devinf.IPAdress);
//deviceInformation is initialized as well but I have no access to its attributes
view.AddWebAllowedObject("deviceInformation", devinf);
}
}
这就是我在 js 中的调用方式:
else if ($.os.ie) {
myIpAdr = window.win_ipadress;
//Throws an exception because GetIPAdress() is "undefined"
myIpAdr = window.deviceInformation.GetIPAdress();
}
我在 Windows 通用应用程序中使用它。 Javascript 并在 WebView 中显示 HTML-Code is already in use for Android an iOS.
我认为您需要定义以小写字符开头的方法名称。
例如:将GetIPAddress改为getIPAddress。
我这边测试了一下,发现如果我用大写的名字'GetIPAddress',是不行的。但是如果我使用 getIPAddress,它就可以工作。
而且我在 this 线程中阅读了 kangax 的解释后,我认为它是有道理的。
[更新]
因为你修改了方法名后还是不行,我想问题应该与你如何暴露windows运行时对象有关。我猜你只是定义了 DeviceInformation class 并试图在同一个项目中使用它。
首先,我们需要创建一个单独的windows通用windows运行时组件项目。
c# class DeviceInformation 应该放到这个项目中。保留相同的代码。
然后,在您的通用应用程序项目中,添加对 windows 运行时组件的引用并保留其余代码以使用 windows 运行时对象。
[更新 2]
刚刚注意到 VS 中的一个有趣行为。不管我们在C#中定义的方法名是大写还是小写开头,visual studio智能提示都是小写的,所以当我们在js中使用时,方法名会自动转换。