Сообщение 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 мы можем подписаться на события
И отправлять сообщения
На стороне натива
Можно принмать сообщения
Так и отправлять
Все это можно вызывать через Proxy
// Пример вызова метода .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
Использование такое
Можно для асинхронных методов result внутри 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 сделать асинхронным
Буду рад любым советам. И может это никому и не нужно и не стоит вообще писать в стол?
Использование в TypeScript классов .Net
Есть идея иметь доступ из TypeScript к методам и свойствам классов .Net.
У меня есть опыт вызова методов .Net объектов из натива https://habrahabr.ru/users/serginio1/topics/
И в частности Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
Есть идея вызвать через Native Client Messaging System
Там мы имеем взаимодействие JavaScript и натива через сообщения
В JavaScript мы можем подписаться на события
И отправлять сообщения
На стороне натива
Можно принмать сообщения
Так и отправлять
Все это можно вызывать через Proxy
// Пример вызова метода .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
Использование такое
Можно для асинхронных методов result внутри Net сделать асинхронным
Буду рад любым советам. И может это никому и не нужно и не стоит вообще писать в стол?
Правда нашел ссылку на возможность финализатора https://www.npmjs.com/package/finalize
У меня есть опыт вызова методов .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