Сообщение CEF, ES6, Angular 2, TypeScript использование классов .Net от 12.01.2017 12:34
Изменено 01.02.2017 8:58 Serginio1
Использование в TypeScript классов .Net
Есть идея иметь доступ из TypeScript к методам и свойствам классов .Net.
У меня есть опыт вызова методов .Net объектов из натива https://habrahabr.ru/users/serginio1/topics/
И в частности Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
Есть идея вызвать через Native Client Messaging System
Там мы имеем взаимодействие JavaScript и натива через сообщения
В JavaScript мы можем подписаться на события
И отправлять сообщения
На стороне натива
Можно принмать сообщения
Так и отправлять
Все это можно вызывать через Proxy
// Пример вызова метода .Net
Так как в в JavaScript нет финализаторов, то можно использовать WeakMap
Использование такое
Можно для асинхронных методов result внутри Net сделать асинхронным
Буду рад любым советам. И может это никому и не нужно и не стоит вообще писать в стол?
Правда нашел ссылку на возможность финализатора https://www.npmjs.com/package/finalize
Внутри этот метод использует https://github.com/TooTallNate/node-weak
У меня есть опыт вызова методов .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Внутри этот метод использует https://github.com/TooTallNate/node-weak
var weak = require('weak')
// we are going to "monitor" this Object and invoke "cleanup"
// before the object is garbage collected
var obj = {
a: true
, foo: 'bar'
}
// Here's where we set up the weak reference
var ref = weak(obj, function () {
// `this` inside the callback is the EventEmitter.
console.log('"obj" has been garbage collected!')
})
// While `obj` is alive, `ref` proxies everything to it, so:
ref.a === obj.a
ref.foo === obj.foo
// Clear out any references to the object, so that it will be GC'd at some point...
obj = null
//
//// Time passes, and the garbage collector is run
//
// `callback()` above is called, and `ref` now acts like an empty object.
typeof ref.foo === 'undefined'Использование в TypeScript классов .Net
Все сделал. Сейчас пишу статью на Хабре.
Рабочее название
CEF,Es6,Angular 2,TypeScript использование классов .Net Core для расширения возможностей
Рабочее название
CEF,Es6,Angular 2,TypeScript использование классов .Net Core для расширения возможностей