Здравствуйте, 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 метода для эвентов и асинхронных методов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>>Ну опять же тебе нужно писать сервер.
AVK>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.
Ну не в одно. Но обработку запросов кто писать будет?
Здесь берешь любой класс из любой сборки и работаешь с ним как с родным. Сейчас еще бинарные операции добавлю.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>>Ну опять же тебе нужно писать сервер.
AVK>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Ты просто не умеешь его готовить. S>> Так вот я и спрашиваю как?
AVK>Что как?
S>> Никто не отвечает
AVK>Потому что ты вопросы задавать не умеешь.
Ну у меня сейчас каждый раз инициализируется соединение и разрыв после ответа.
Завтра посмотрю на постоянном соединении
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, 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;
}
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>Лямбды пока еще не отменили. S> А лямбды кто писать будет?
Лямбды могут быть частью одного выражения.
S>По твоему и HTTP сервер тоже можно не писать.
По моему простенький HTTP сервер для RPC по отношению к остальным задачам не стоит выеденного яйца. Если что — я в свое время исходники HttpChannel почти наизусть знал.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Лямбды пока еще не отменили. S>> А лямбды кто писать будет?
AVK>Лямбды могут быть частью одного выражения.
То есть с клиента передаешь сериализованные лямбды на сервер, компилируешь и выполняешь на сервере? S>>По твоему и HTTP сервер тоже можно не писать.
AVK>По моему простенький HTTP сервер для RPC по отношению к остальным задачам не стоит выеденного яйца. Если что — я в свое время исходники HttpChannel почти наизусть знал.
Прошу прощения неправильно выразился. В данном случае и мел ввиду сервис. То есть Web Api Controllers.
В моем случае можно специально не писать даже сборки. Ибо можно использовать динамическую компиляцию. Она кстати у меня используется для создания Proxy для подключения к событиям.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Лямбды пока еще не отменили. S>> А лямбды кто писать будет?
AVK>Лямбды могут быть частью одного выражения.
Кстати дал бы ссылочку на правильную работу с Tcp.
Я так понимаю нужен кэш на постоянное соединение, так как есть вызовы из Эвеннтов а и задачи могут применяться.
Завтра сравню скорость с постоянным соединением и подключением . Но для аналога AppDomain нужны пайпы.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Ты просто не умеешь его готовить. S>> Так вот я и спрашиваю как?
AVK>Что как?
S>> Никто не отвечает
AVK>Потому что ты вопросы задавать не умеешь.
Здравствуйте, vorona, Вы писали:
V>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, Serginio1, Вы писали:
S>>Хочу написать статью. И прошу совета какой пример показать в вау эффектом.
V>Нужно придумать реальную задачу которую удобно решить с помощью твоего велосипеда.
На самом деле это замена AppDomain. Смысл, что то сделать и выгрузить.
Второе это управление приложением из другого приложения например через статические методы и свойства.
и солнце б утром не вставало, когда бы не было меня
Надеюсь на помощь в примеров с вау эффектом для удаленного вызова.
Например можно выводить сообщение в консоли сервера
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 свой вело
В ней подробно рассказывается как создавать удаленные объекты и вызывать их методы.
Само решение очень близко с COM out process взаимодействием на IDispatch.
Помню с удовольствием разбирался с внутренностями TSocketConnection.
Но, в отличие от Idispatch, используется перегрузка методов и операторов, вызов Generic методов с выводом типов или с заданием Generic аргументов.
Поддержка методов расширений для классов, находящихся в одной сборке и для Linq методов.
Также поддержка асинхронных методов и подписка на события, ref и out параметры, доступ по индексу [], поддержка итераторов в foreach.
В отличии от Web Api, не нужно писать специально серверный код Controller, Hub ы.
Это близко к AppDomain c Remouting но, в отличие от Remoting, каждый класс является аналогом MarshalByRefObject. То есть, мы можем создать любой объект на стороне сервера и вернуть ссылку на него (некоторые языки из чисел поддерживают только double).
При вызове методов, напрямую сериализуются параметры только следующих типов: числа, строки, дата, Guid и byte[]. Для остальных типов нужно их создать на стороне сервера, а в параметрах методов уже передаются ссылки на них.
и солнце б утром не вставало, когда бы не было меня