使用OPC ua.net库在Unity3d中创建一个非常简单的OPC客户端

使用OPC ua.net库在Unity3d中创建一个非常简单的OPC客户端,.net,unity3d,hololens,opc,opc-ua,.net,Unity3d,Hololens,Opc,Opc Ua,我在尝试使用Unity3D在.Net中实现简单客户端时遇到这些错误。这些错误在Visual Studio中: Severity Code Description Project File Line Suppression State Error CS0012 The type 'X509CertificateValidator' is defined in an assembly that is not referenced. You must add a refe

我在尝试使用Unity3D在.Net中实现简单客户端时遇到这些错误。这些错误在Visual Studio中:

Severity    Code    Description Project File    Line    Suppression State
Error   CS0012  The type 'X509CertificateValidator' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.ServiceModel.Primitives, Version=4.5.0.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Test    C:\Users\hidethepain\Documents\opc\Assets\main.cs   27  

Severity    Code    Description Project File    Line    Suppression State
Error   CS0012  The type 'Enum' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.    Test, Test.Player   C:\Users\hidethepain\Documents\opc\Assets\main.cs   18  Active

Severity    Code    Description Project File    Line    Suppression State
Error   CS0012  The type 'Task<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.  Test, Test.Player   C:\Users\hidethepain\Documents\opc\Assets\main.cs   31  Active
Unity3D使用脚本运行时版本.Net 3.5,我将其更改为.Net 4.6,以便能够使用

这是我的密码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Opc.Ua; 
using Opc.Ua.Client;
using Opc.Ua.Configuration;

public class main : MonoBehaviour
{

    private async void Start()
    {
        Console.WriteLine("Step 1 - Create a config.");
        var config = new ApplicationConfiguration()
        {
            ApplicationName = "test-opc",
            ApplicationType = ApplicationType.Client,
            SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier() },
            TransportConfigurations = new TransportConfigurationCollection(),
            TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
            ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
        };
        await config.Validate(ApplicationType.Client);
        if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates)
        {
            config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); };
        }

        Console.WriteLine("Step 2 - Create a session with your server.");
        using (var session = await Session.Create(config, new ConfiguredEndpoint(null, new EndpointDescription("opc.tcp://localhost:4841")), true, "", 60000, null, null))
        {
            Console.WriteLine("Step 3 - Browse the server namespace.");
            ReferenceDescriptionCollection refs;
            byte[] cp;
            session.Browse(null, null, ObjectIds.ObjectsFolder, 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out cp, out refs);
            Console.WriteLine("DisplayName: BrowseName, NodeClass");
            foreach (var rd in refs)
            {
                Console.WriteLine(rd.DisplayName + ": " + rd.BrowseName + ", " + rd.NodeClass);
                ReferenceDescriptionCollection nextRefs;
                byte[] nextCp;
                session.Browse(null, null, ExpandedNodeId.ToNodeId(rd.NodeId, session.NamespaceUris), 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out nextCp, out nextRefs);
                foreach (var nextRd in nextRefs)
                {
                    Console.WriteLine("+ " + nextRd.DisplayName + ": " + nextRd.BrowseName + ", " + nextRd.NodeClass);
                }
            }

            Console.WriteLine("Step 4 - Create a subscription. Set a faster publishing interval if you wish.");
            var subscription = new Subscription(session.DefaultSubscription) { PublishingInterval = 1000 };

            Console.WriteLine("Step 5 - Add a list of items you wish to monitor to the subscription.");
            var list = new List<MonitoredItem> {
                new MonitoredItem(subscription.DefaultItem) { DisplayName = "aaatime", StartNodeId = "i=10004" } };
            list.ForEach(i => i.Notification += OnNotification);
            subscription.AddItems(list);

            Console.WriteLine("Step 6 - Add the subscription to the session.");
            session.AddSubscription(subscription);
            subscription.Create();

            Console.WriteLine("Finished client initialization");
        }
    }

    private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
    {
        foreach (var value in item.DequeueValues())
        {
            Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用制度;
使用Opc.Ua;
使用Opc.Ua.Client;
使用Opc.Ua.Configuration;
公共课主要内容:单一行为
{
私有异步void Start()
{
WriteLine(“步骤1-创建配置”);
var config=新应用程序配置()
{
ApplicationName=“测试opc”,
ApplicationType=ApplicationType.Client,
SecurityConfiguration=new SecurityConfiguration{ApplicationCertificate=new CertificateIdentifier()},
TransportConfigurations=新的TransportConfigurationCollection(),
TransportQuotas=新的TransportQuotas{OperationTimeout=15000},
ClientConfiguration=new ClientConfiguration{DefaultSessionTimeout=60000}
};
等待config.Validate(ApplicationType.Client);
if(config.SecurityConfiguration.AutoAcceptUntrustedCertificates)
{
config.CertificateValidator.CertificateValidation+=(s,e)=>{e.Accept=(e.Error.StatusCode==StatusCodes.BadCertificateUntrusted);};
}
WriteLine(“第2步-创建与服务器的会话”);
使用(var session=await session.Create(配置,新配置的数据点(null,新端点描述(“opc”)。tcp://localhost:4841“”),真“”,60000,空,空)
{
WriteLine(“步骤3-浏览服务器名称空间”);
参考描述集合参考;
字节[]cp;
session.Browse(null,null,objectId.ObjectsFolder,0u,browsedDirection.Forward,ReferenceTypeId.HierarchicalReferences,true,(uint)NodeClass.Variable |(uint)NodeClass.Object |(uint)NodeClass.Method,out cp,out refs);
Console.WriteLine(“显示名称:BrowseName,NodeClass”);
foreach(参考文献中的变量rd)
{
Console.WriteLine(rd.DisplayName+“:“+rd.BrowseName+”,“+rd.NodeClass);
参考描述集合的下一步;
字节[]nextCp;
session.Browse(null,null,ExpandedNodeId.ToNodeId(rd.NodeId,session.NamespaceUris),0u,browsedDirection.Forward,referenceTypeId.HierarchicalReferences,true,(uint)NodeClass.Variable |(uint)NodeClass.Object |(uint)NodeClass.Method,out-nextCp,out-nextRefs);
foreach(nextRefs中的var nextRd)
{
Console.WriteLine(“+”+nextRd.DisplayName+”:“+nextRd.BrowseName+”,“+nextRd.NodeClass”);
}
}
WriteLine(“第4步-创建订阅。如果愿意,请设置更快的发布间隔。”);
var subscription=新订阅(session.DefaultSubscription){PublishingInterval=1000};
WriteLine(“第5步-向订阅中添加要监视的项目列表”);
变量列表=新列表{
新的MonitoredItem(subscription.DefaultItem){DisplayName=“aaatime”,StartNodeId=“i=10004”};
list.ForEach(i=>i.Notification+=OnNotification);
订阅。附加项(列表);
WriteLine(“步骤6-将订阅添加到会话中”);
会话.添加订阅(订阅);
subscription.Create();
Console.WriteLine(“完成客户端初始化”);
}
}
私有静态void OnNotification(MonitoredItem项,MonitoredItemNotificationEventArgs e)
{
foreach(item.DequeueValues()中的var值)
{
WriteLine(“{0}:{1},{2},{3}”,item.DisplayName,value.value,value.SourceTimestamp,value.StatusCode);
}
}
}
代码从移植到Unity3d。 如何解决这些错误?

网站上的文档说最低要求是.NET标准2.0。
根据Unity论坛的说法,开发者只限于.NET标准版本1.4,只要他们在播放器设置中选择.NET作为脚本后端

我没有测试这个特定的库,但我认为当您切换到IL2CPP时它应该可以工作,因为它支持2.0

从2018.2版开始,Unity将.NET标记为已弃用版本,因此我认为他们今后不会大力改变这种情况,而是将重点放在IL2CPP上。
真遗憾,我喜欢.NET的短构建周期

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Opc.Ua; 
using Opc.Ua.Client;
using Opc.Ua.Configuration;

public class main : MonoBehaviour
{

    private async void Start()
    {
        Console.WriteLine("Step 1 - Create a config.");
        var config = new ApplicationConfiguration()
        {
            ApplicationName = "test-opc",
            ApplicationType = ApplicationType.Client,
            SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier() },
            TransportConfigurations = new TransportConfigurationCollection(),
            TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
            ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
        };
        await config.Validate(ApplicationType.Client);
        if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates)
        {
            config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); };
        }

        Console.WriteLine("Step 2 - Create a session with your server.");
        using (var session = await Session.Create(config, new ConfiguredEndpoint(null, new EndpointDescription("opc.tcp://localhost:4841")), true, "", 60000, null, null))
        {
            Console.WriteLine("Step 3 - Browse the server namespace.");
            ReferenceDescriptionCollection refs;
            byte[] cp;
            session.Browse(null, null, ObjectIds.ObjectsFolder, 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out cp, out refs);
            Console.WriteLine("DisplayName: BrowseName, NodeClass");
            foreach (var rd in refs)
            {
                Console.WriteLine(rd.DisplayName + ": " + rd.BrowseName + ", " + rd.NodeClass);
                ReferenceDescriptionCollection nextRefs;
                byte[] nextCp;
                session.Browse(null, null, ExpandedNodeId.ToNodeId(rd.NodeId, session.NamespaceUris), 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out nextCp, out nextRefs);
                foreach (var nextRd in nextRefs)
                {
                    Console.WriteLine("+ " + nextRd.DisplayName + ": " + nextRd.BrowseName + ", " + nextRd.NodeClass);
                }
            }

            Console.WriteLine("Step 4 - Create a subscription. Set a faster publishing interval if you wish.");
            var subscription = new Subscription(session.DefaultSubscription) { PublishingInterval = 1000 };

            Console.WriteLine("Step 5 - Add a list of items you wish to monitor to the subscription.");
            var list = new List<MonitoredItem> {
                new MonitoredItem(subscription.DefaultItem) { DisplayName = "aaatime", StartNodeId = "i=10004" } };
            list.ForEach(i => i.Notification += OnNotification);
            subscription.AddItems(list);

            Console.WriteLine("Step 6 - Add the subscription to the session.");
            session.AddSubscription(subscription);
            subscription.Create();

            Console.WriteLine("Finished client initialization");
        }
    }

    private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
    {
        foreach (var value in item.DequeueValues())
        {
            Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
        }
    }
}