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中使用时,方法名会自动转换。