Информация об изменениях

Сообщение CEF, ES6, Angular 2, TypeScript использование классов .Net от 12.01.2017 12:34

Изменено 12.01.2017 13:58 Serginio1

Использование в TypeScript классов .Net
Есть идея иметь доступ из TypeScript к методам и свойствам классов .Net.
У меня есть опыт вызова методов .Net объектов из натива https://habrahabr.ru/users/serginio1/topics/
И в частности Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
Есть идея вызвать через Native Client Messaging System
Там мы имеем взаимодействие JavaScript и натива через сообщения
В JavaScript мы можем подписаться на события

function handleMessage(message) {
  // In the example, we simply log the data that's received in the message.
  var logEl = document.getElementById('log');
  logEl.textContent += message.data;
}

И отправлять сообщения
var dictionary = {
  key:guid,
  MethodName: name,
  param_array: args
}
nacl_module.postMessage(dictionary);

На стороне натива
Можно принмать сообщения


virtual void HandleMessage(const pp::Var& var) {
  if (var.is_dictionary()) {
    pp::VarDictionary dictionary(var);
    // Use the dictionary
    pp::VarArray keys = dictionary.GetKeys();
    // ...
  } else {
    // ...
  }
}


Так и отправлять
pp::VarDictionary dictionary;
dictionary.Set(pp::Var("command"), pp::Var(next_command));
dictionary.Set(pp::Var("param_int"), pp::Var(123));
pp::VarArray an_array;
an_array.Set(0, pp::Var("string0"));
an_array.Set(1, pp::Var("string1"))
dictionary.Set(pp::Var("param_array"), an_array);
PostMessage(dictionary);



Все это можно вызывать через Proxy

class NetWrapper{

    public currentCount: any;

    public static dictionary = {};

    public proxy: any;

    public static wm = new WeakMap(); // Слабые ссылки на объекты
    public static refArray = new Array<int>(); // ссылки на .Net объекты   
    constructor(private netRef:int) { this.SetProxy(); }


     private GetPromise(name: PropertyKey,args)
    {

        let key = Guid.newGuid();
        let promise = new Promise((resolve, reject) => {
            let item = new Item(resolve, args, name);
            this.dictionary[key] = item;

           var dictionary = {
           netRef:netRef,
           key:key,
           MethodName: name,
           param_array: args
         }
          nacl_module.postMessage(dictionary);
        });


        return promise;
    }


    private SetProxy(): void {

        let self=this;
        this.proxy = new Proxy({}, {

            get: function(rcvr: any, name: PropertyKey)
            {

               // Проблемы с определением, что свойство возвращает ссылку на метод
               // поэтому будем вызвать все как методы
               // if (этоСвойство)
               //     return self.GetPromise(name, []);

               return (...args) => {
                   return self.GetPromise(name,args)

                };


            }


        });
    }

// Пример вызова метода .Net

function handleMessage(message) {
// In the example, we simply log the data that's received in the message.
let data=message.data;
let result=data.result;
let item = <Item>this.dictionary[key];

delete this.dictionary[key];

if (data.resultIsObject)
{

let ref=<int>result;
result=new NetWrapper(ref);
refArray.push(ref);
wm.set(result,ref);
}

item.resolve(result);

}
Так как в в JavaScript нет финализаторов, то можно использовать WeakMap


Использование такое

 let HttpClient=await NetWrap.GetType("System.Net.Http.HttpClient","System.Net.Http.dll");
 let HttpClientHandler = await NetWrap.GetType("System.Net.Http.HttpClientHandler","System.Net.Http.dll");

let client=await NetWrap.new(HttpClient);
let responst= await (await client.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx")).Result;


Можно для асинхронных методов result внутри Net сделать асинхронным
Буду рад любым советам. И может это никому и не нужно и не стоит вообще писать в стол?
javascript typescript .net core es6
Использование в TypeScript классов .Net
Есть идея иметь доступ из TypeScript к методам и свойствам классов .Net.
У меня есть опыт вызова методов .Net объектов из натива https://habrahabr.ru/users/serginio1/topics/
И в частности Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
Есть идея вызвать через Native Client Messaging System
Там мы имеем взаимодействие JavaScript и натива через сообщения
В JavaScript мы можем подписаться на события

function handleMessage(message) {
  // In the example, we simply log the data that's received in the message.
  var logEl = document.getElementById('log');
  logEl.textContent += message.data;
}

И отправлять сообщения
var dictionary = {
  key:guid,
  MethodName: name,
  param_array: args
}
nacl_module.postMessage(dictionary);

На стороне натива
Можно принмать сообщения


virtual void HandleMessage(const pp::Var& var) {
  if (var.is_dictionary()) {
    pp::VarDictionary dictionary(var);
    // Use the dictionary
    pp::VarArray keys = dictionary.GetKeys();
    // ...
  } else {
    // ...
  }
}


Так и отправлять
pp::VarDictionary dictionary;
dictionary.Set(pp::Var("command"), pp::Var(next_command));
dictionary.Set(pp::Var("param_int"), pp::Var(123));
pp::VarArray an_array;
an_array.Set(0, pp::Var("string0"));
an_array.Set(1, pp::Var("string1"))
dictionary.Set(pp::Var("param_array"), an_array);
PostMessage(dictionary);



Все это можно вызывать через Proxy

class NetWrapper{

    public currentCount: any;

    public static dictionary = {};

    public proxy: any;

    public static wm = new WeakMap(); // Слабые ссылки на объекты
    public static refArray = new Array<int>(); // ссылки на .Net объекты   
    constructor(private netRef:int) { this.SetProxy(); }


     private GetPromise(name: PropertyKey,args)
    {

        let key = Guid.newGuid();
        let promise = new Promise((resolve, reject) => {
            let item = new Item(resolve, args, name);
            this.dictionary[key] = item;

           var dictionary = {
           netRef:netRef,
           key:key,
           MethodName: name,
           param_array: args
         }
          nacl_module.postMessage(dictionary);
        });


        return promise;
    }


    private SetProxy(): void {

        let self=this;
        this.proxy = new Proxy({}, {

            get: function(rcvr: any, name: PropertyKey)
            {

               // Проблемы с определением, что свойство возвращает ссылку на метод
               // поэтому будем вызвать все как методы
               // if (этоСвойство)
               //     return self.GetPromise(name, []);

               return (...args) => {
                   return self.GetPromise(name,args)

                };


            }


        });
    }

// Пример вызова метода .Net

function handleMessage(message) {
// In the example, we simply log the data that's received in the message.
let data=message.data;
let result=data.result;
let item = <Item>this.dictionary[key];

delete this.dictionary[key];

if (data.resultIsObject)
{

let ref=<int>result;
result=new NetWrapper(ref);
refArray.push(ref);
wm.set(result,ref);
}

item.resolve(result);

}
Так как в в JavaScript нет финализаторов, то можно использовать WeakMap


Использование такое

 let HttpClient=await NetWrap.GetType("System.Net.Http.HttpClient","System.Net.Http.dll");
 let HttpClientHandler = await NetWrap.GetType("System.Net.Http.HttpClientHandler","System.Net.Http.dll");

let client=await NetWrap.new(HttpClient);
let responst= await (await client.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx")).Result;


Можно для асинхронных методов result внутри Net сделать асинхронным
Буду рад любым советам. И может это никому и не нужно и не стоит вообще писать в стол?

Правда нашел ссылку на возможность финализатора https://www.npmjs.com/package/finalize
var finalize = require('finalize');
 
var obj = { x: 1337 };
finalize(obj, function () {
  console.log(this.x); // this will print '1337' 
});
global.gc();
// nothing will happen, var obj above holds obj alive 
obj = null;
global.gc();
// the previous line should trigger the callback above
javascript typescript .net core es6