Re[8]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 14:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


S>>Ghb добавлении

S>>using System?.IO?.Pipes
S>> ругается на Pipes

AVK>

AVK>Assembly
AVK>System.IO.Pipes.dll


Нашел в \.nuget\packages\System.IO.Pipes\4.3.0\ref\netstandard1.3\

Но студия не хочет этот пакет использовать почему то.
Ладно добью библиотеку если это хоть кому то нужно будет сделаю и для пайпов. Там переделать всего 2 метода для эвентов и асинхронных методов.
и солнце б утром не вставало, когда бы не было меня
Re[6]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 14:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


S>>Ну опять же тебе нужно писать сервер.


AVK>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.


Ну не в одно. Но обработку запросов кто писать будет?

Здесь берешь любой класс из любой сборки и работаешь с ним как с родным. Сейчас еще бинарные операции добавлю.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 28.02.2017 14:17 Serginio1 . Предыдущая версия .
Re[6]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 14:25
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


S>>Ну опять же тебе нужно писать сервер.


AVK>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.


Кстати не подскажешь как из VS 2017 на GitHub выйти. Показывает только
https://serginio1.visualstudio.com/defaultcollection/RPCProjects/RPCProjects%20Team/_git/RPCProjects
и солнце б утром не вставало, когда бы не было меня
Re[7]: .Net Core, AppDomain, RPC свой велосипед
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.02.17 15:18
Оценка:
Здравствуйте, Serginio1, Вы писали:

AVK>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.

S>Ну не в одно.

Именно что в одно.

S> Но обработку запросов кто писать будет?


Лямбды пока еще не отменили.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: .Net Core, AppDomain, RPC свой велосипед
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.02.17 15:18
Оценка:
Здравствуйте, Serginio1, Вы писали:

AVK>>Ты просто не умеешь его готовить.

S> Так вот я и спрашиваю как?

Что как?

S> Никто не отвечает


Потому что ты вопросы задавать не умеешь.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 16:40
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Ты просто не умеешь его готовить.

S>> Так вот я и спрашиваю как?

AVK>Что как?


S>> Никто не отвечает


AVK>Потому что ты вопросы задавать не умеешь.


Ну у меня сейчас каждый раз инициализируется соединение и разрыв после ответа.
Завтра посмотрю на постоянном соединении
и солнце б утром не вставало, когда бы не было меня
Re[8]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 16:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.

S>>Ну не в одно.

AVK>Именно что в одно.


S>> Но обработку запросов кто писать будет?


AVK>Лямбды пока еще не отменили.

А лямбды кто писать будет?

По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка


static void SetResult(MemoryStream ms, NetworkStream ns)
        {
            ms.Position = 0;
            ns.Write(BitConverter.GetBytes((Int32)ms.Length), 0, 4);
            ms.CopyTo(ns);
            ns.Flush();


        }

 private void RunMethod(NetworkStream ns, MemoryStream ms, IPAddress adress)
        {
            using (BinaryReader br = new BinaryReader(ms))
            {
                var msRes = new MemoryStream();
                using(BinaryWriter bw= new BinaryWriter(msRes))
                { 
                    var cm = (CallMethod)br.ReadByte();
                   
                    switch (cm)
                    {
                        case CallMethod.CallFunc: CallAsFunc(br, bw); break;
                        case CallMethod.GetMember: GetPropVal(br, bw); break;
                        case CallMethod.SetMember: SetPropVal(br, bw); break;
                        case CallMethod.CallFuncAsync: CallAsyncFunc(br, bw, adress); break;
                        case CallMethod.CallDelegate: CallAsDelegate(br, bw); break;
                        case CallMethod.CallGenericFunc: CallAsGenericFunc(br, bw); break;
                        case CallMethod.GetWrapperForObjectWithEvents: GetWrapperForObjectWithEvents(br, bw, adress); break;
                        case CallMethod.GetIndex: GetIndex(br, bw); break;
                        case CallMethod.SetIndex: SetIndex(br, bw); break;
                        case CallMethod.IteratorNext: IteratorNext(br, bw); break;
                        case CallMethod.DeleteObjects: DeleteObjects(br, bw); break;

                    }

                    bw.Flush();
                    SetResult(msRes, ns);
                }

            }
        }
        private void ExecuteMethod(TcpClient client)
        {
            var adress=((IPEndPoint)client.Client.RemoteEndPoint).Address;
        //    client.Client.NoDelay = true;
            using (NetworkStream ns = client.GetStream())
            {

                // Получим данные с клиента и на основании этих данных
                //Создадим ДанныеДляКлиета1С котрый кроме данных содержит 
                //TcpClient для отправки ответа
                using (var br = new BinaryReader(ns))
                {
                    var streamSize = br.ReadInt32();

                    var res = br.ReadBytes(streamSize);

                    var ms = new MemoryStream(res);
                    ms.Position = 0;
                    RunMethod(ns, ms, adress);
                }



            }

        }




static bool  GetAW(BinaryReader br, BinaryWriter bw, out NetObjectToNative.AutoWrap  AW )
        {

            var Target = br.ReadInt32();

            AW = NetObjectToNative.AutoWrap.ObjectsList.GetValue(Target);

            if (AW == null)
            {
                SetError("Не найдена ссылка на объект", bw);

                return false;
            }

            return true;
        }

 public static bool CallAsFuncAll(BinaryReader br, BinaryWriter bw, out object result, bool WriteResult)
        {
            result = null;
            NetObjectToNative.AutoWrap AW;
            if (!GetAW(br, bw, out AW))
                return false;



            string MethodName = br.ReadString();
            var args = GetArrayParams(br);

            string Error;
            List<int> ChageParams = new List<int>();

           
            var res = AW.TryInvokeMember(MethodName, args, out result, ChageParams, out Error);
            if (!res)
            {
                SetError(Error, bw);
                return false;
            }

           if (WriteResult)
            {
                bw.Write(true);
                WorkWhithVariant.WriteObject(NetObjectToNative.AutoWrap.WrapObject(result), bw);
                WriteChandeParams(bw, args, ChageParams);


            }
            return true;
        }
и солнце б утром не вставало, когда бы не было меня
Отредактировано 28.02.2017 16:47 Serginio1 . Предыдущая версия .
Re[9]: .Net Core, AppDomain, RPC свой велосипед
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.02.17 16:50
Оценка:
Здравствуйте, Serginio1, Вы писали:

AVK>>Лямбды пока еще не отменили.

S> А лямбды кто писать будет?

Лямбды могут быть частью одного выражения.

S>По твоему и HTTP сервер тоже можно не писать.


По моему простенький HTTP сервер для RPC по отношению к остальным задачам не стоит выеденного яйца. Если что — я в свое время исходники HttpChannel почти наизусть знал.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[10]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 17:58
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Лямбды пока еще не отменили.

S>> А лямбды кто писать будет?

AVK>Лямбды могут быть частью одного выражения.


То есть с клиента передаешь сериализованные лямбды на сервер, компилируешь и выполняешь на сервере?
S>>По твоему и HTTP сервер тоже можно не писать.

AVK>По моему простенький HTTP сервер для RPC по отношению к остальным задачам не стоит выеденного яйца. Если что — я в свое время исходники HttpChannel почти наизусть знал.


Прошу прощения неправильно выразился. В данном случае и мел ввиду сервис. То есть Web Api Controllers.

В моем случае можно специально не писать даже сборки. Ибо можно использовать динамическую компиляцию. Она кстати у меня используется для создания Proxy для подключения к событиям.

1С,.Net Core. Динамическая компиляция класса обертки для получения событий .Net объекта в 1С

.Net Core, 1C, динамическая компиляция, Scripting API

Правда в первый раз долго обрабатывает. Но затем приемлемо.
и солнце б утром не вставало, когда бы не было меня
Re[10]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.17 18:52
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Лямбды пока еще не отменили.

S>> А лямбды кто писать будет?

AVK>Лямбды могут быть частью одного выражения.


Кстати дал бы ссылочку на правильную работу с Tcp.
Я так понимаю нужен кэш на постоянное соединение, так как есть вызовы из Эвеннтов а и задачи могут применяться.
Завтра сравню скорость с постоянным соединением и подключением . Но для аналога AppDomain нужны пайпы.
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.03.17 07:46
Оценка:
Здравствуйте, Serginio1, Вы писали:

Сделал поддержку перегрузки оператора


    // Test поддерки перегрузки операторов.
        //Взят отсюда https://professorweb.ru/my/csharp/charp_theory/level6/6_4.php
        public static void TestCallOperators(dynamic wrap)
        {

            var MyArr = wrap.GetType("TestDllForCoreClr.MyArr", "TestDll");
            var Point1 = MyArr._new(1, 12, -4);
            var Point2 = MyArr._new(0, -3, 18);

        Console.WriteLine("Координаты первой точки: " +
                Point1.x + " " + Point1.y + " " + Point1.z);
            Console.WriteLine("Координаты второй точки: " +
                Point2.x + " " + Point2.y + " " + Point2.z + "\n");

            var Point3 = Point1 + Point2;
        Console.WriteLine("\nPoint1 + Point2 = "
                + Point3.x + " " + Point3.y + " " + Point3.z);
            Point3 = Point1 - Point2;
            Console.WriteLine("Point1 - Point2 = "
                + Point3.x + " " + Point3.y + " " + Point3.z);
            Point3 = -Point1;
            Console.WriteLine("-Point1 = "
                + Point3.x + " " + Point3.y + " " + Point3.z);
            Point2++;
            Console.WriteLine("Point2++ = "
                + Point2.x + " " + Point2.y + " " + Point2.z);
            Point2--;
            Console.WriteLine("Point2-- = "
                + Point2.x + " " + Point2.y + " " + Point2.z);

     
        }

    }
и солнце б утром не вставало, когда бы не было меня
Re[8]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.03.17 09:54
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Serginio1, Вы писали:


AVK>>>Ты просто не умеешь его готовить.

S>> Так вот я и спрашиваю как?

AVK>Что как?


S>> Никто не отвечает


AVK>Потому что ты вопросы задавать не умеешь.


Сделал тесту с постоянным соединением и с подключением и разрывом на какждый запрос
http://rsdn.org/forum/network/6712077.1
Автор: Serginio1
Дата: 01.03.17


Разница на порядок. и составляет порядка 20 000 запросов в секунду. Что вполне приемлемо.
http://rsdn.org/forum/network/6712077.1
Автор: Serginio1
Дата: 01.03.17
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.03.17 08:01
Оценка:
Здравствуйте, Serginio1, Вы писали:

Ну вроде добил. Скорость обмена по Tcp/IP порядка 14 000 вызовов в секунду. В 1С порядка 20 на внутрипроцессном.

Хочу написать статью. И прошу совета какой пример показать в вау эффектом.

Например перегрузка операторов


// Test поддерки перегрузки операторов.
        //Взят отсюда https://professorweb.ru/my/csharp/charp_theory/level6/6_4.php
        public static void TestCallOperators(dynamic wrap)
        {
            // получим ти по строкому представлению TestDllForCoreClr.MyArr
            // Из сборки TestDll
            var MyArr = wrap.GetType("TestDllForCoreClr.MyArr", "TestDll");

            // Создадим объекты на стороне сервера
            // и получим ссылки на них
            var Point1 = MyArr._new(1, 12, -4);
            var Point2 = MyArr._new(0, -3, 18);


            // Все операции происходят на стороне сервера
            Console.WriteLine("Координаты первой точки: " +
                Point1.x + " " + Point1.y + " " + Point1.z);
            Console.WriteLine("Координаты второй точки: " +
                Point2.x + " " + Point2.y + " " + Point2.z + "\n");

            var Point3 = Point1 + Point2;
            Console.WriteLine("\nPoint1 + Point2 = "
                + Point3.x + " " + Point3.y + " " + Point3.z);
            Point3 = Point1 - Point2;
            Console.WriteLine("Point1 - Point2 = "
                + Point3.x + " " + Point3.y + " " + Point3.z);
            Point3 = -Point1;
            Console.WriteLine("-Point1 = "
                + Point3.x + " " + Point3.y + " " + Point3.z);
            Point2++;
            Console.WriteLine("Point2++ = "
                + Point2.x + " " + Point2.y + " " + Point2.z);
            Point2--;
            Console.WriteLine("Point2-- = "
                + Point2.x + " " + Point2.y + " " + Point2.z);


        }


Кроме первых трех строчек, работа с удаленным объектом как с родным.
и солнце б утром не вставало, когда бы не было меня
Re[2]: .Net Core, AppDomain, RPC свой велосипед
От: vorona  
Дата: 02.03.17 13:27
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>Хочу написать статью. И прошу совета какой пример показать в вау эффектом.


Нужно придумать реальную задачу которую удобно решить с помощью твоего велосипеда.
Re[3]: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.03.17 13:35
Оценка:
Здравствуйте, vorona, Вы писали:

V>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, Serginio1, Вы писали:


S>>Хочу написать статью. И прошу совета какой пример показать в вау эффектом.


V>Нужно придумать реальную задачу которую удобно решить с помощью твоего велосипеда.


На самом деле это замена AppDomain. Смысл, что то сделать и выгрузить.
Второе это управление приложением из другого приложения например через статические методы и свойства.
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core, AppDomain, RPC свой велосипед
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.03.17 07:04
Оценка:
Здравствуйте, Serginio1, Вы писали:

Надеюсь на помощь в примеров с вау эффектом для удаленного вызова.

Например можно выводить сообщение в консоли сервера


string typeStr = typeof(Console).AssemblyQualifiedName;
   var _Console = wrap.GetType(typeStr);// Получим тип на сервере по имени
   // "Hello from Client" будет выведено в консоле сервера
    _Console.WriteLine("Hello from Client");
и солнце б утром не вставало, когда бы не было меня
Re: .Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой вело
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.03.17 07:21
Оценка: 17 (2)
Написал статью .Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед

В ней подробно рассказывается как создавать удаленные объекты и вызывать их методы.

Само решение очень близко с COM out process взаимодействием на IDispatch.
Помню с удовольствием разбирался с внутренностями TSocketConnection.

Но, в отличие от Idispatch, используется перегрузка методов и операторов, вызов Generic методов с выводом типов или с заданием Generic аргументов.
Поддержка методов расширений для классов, находящихся в одной сборке и для Linq методов.

Также поддержка асинхронных методов и подписка на события, ref и out параметры, доступ по индексу [], поддержка итераторов в foreach.

В отличии от Web Api, не нужно писать специально серверный код Controller, Hub ы.
Это близко к AppDomain c Remouting но, в отличие от Remoting, каждый класс является аналогом MarshalByRefObject. То есть, мы можем создать любой объект на стороне сервера и вернуть ссылку на него (некоторые языки из чисел поддерживают только double).
При вызове методов, напрямую сериализуются параметры только следующих типов: числа, строки, дата, Guid и byte[]. Для остальных типов нужно их создать на стороне сервера, а в параметрах методов уже передаются ссылки на них.

и солнце б утром не вставало, когда бы не было меня
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.