Создайте очень простой OPC-клиент в Unity3d с библиотекой opc ua .net - PullRequest
0 голосов
/ 01 ноября 2018

Я получаю эти ошибки при попытке реализовать простой OPC клиент в .Net с Unity3D. Эти ошибки в 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

и другие 49 подобных ошибок.

Unity3D показывает мне эту ошибку:

Assets/main.cs(67,40): error CS0012: The type `System.Object' is defined in an assembly that is not referenced. Consider adding a reference to assembly `netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'

Unity3D использует версию среды выполнения сценариев .Net 3.5 Я изменил ее на .NET 4.6, чтобы иметь возможность использовать OPC Library .

Вот мой код:

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

Код перенесен из .Net Core примера в Unity3d. Как я могу решить эти ошибки?

1 Ответ

0 голосов
/ 15 ноября 2018

Документы на унифицированная архитектура GitHub OPC .NET Standard говорят, что минимальное требование - .NET Standard 2.0.
Согласно Unity Forum Какой .NET стек для UWP / HoloLens? разработчики ограничены .NET Standard версии 1.4, если они выбирают .NET как Скрипт Backend в настройках проигрывателя.

Я не тестировал эту конкретную библиотеку, но думаю, что она должна работать, когда вы переключаетесь на IL2CPP, поскольку она поддерживает 2.0.

Начиная с версии 2018.2. Unity помечает .NET как устаревшую, поэтому я думаю, что в будущем они не будут прилагать больших усилий для изменения ситуации, а вместо этого сосредоточатся на IL2CPP.
Как жаль, мне нравятся короткие циклы сборки с .NET

...