Обработка событий C # .NET с помощью edge.js в Node.js для электронов. - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужно сделать несколько звонков от js к моей C # DLL в моем проекте Electron, и это прекрасно работает следующим образом:

c #

namespace Electron.Wrapper
{
    public class QueryWrapper
    {

        public async Task<object> OnQuery(dynamic request)
        {
            ...
            return ..;
        }
    }
}

js

let edge = require('electron-edge-js');
let queryWrapperQuery = edge.func({
    assemblyFile: '..dllUrl..',
    typeName: 'Electron.Wrapper.QueryWrapper',
    methodName: 'OnQuery'
});
window.query = function (options) {
    queryWrapperQuery(JSON.stringify(options), function (error, result) {
        ...
    });
}

Проблема в том, что я использую внешнюю DLL, которая иногда вызывает асинхронные события, поэтому мне нужно найти способ прослушивания событий .NET из js.

Я нашел таким образом для решения моей проблемы, но я думаю, что это не правильный путь, потому что мне нужна библиотека классов для Electron , и я не знаю, как использовать ее также с предыдущим способом, и, вероятно, мне не нужен WebSocketServer.

Будет оценен пример .Net и js.

Спасибо, Андреа

Обновление 1 Я нашел таким образом холодный будет правильным?Я пытаюсь реализовать .net, какие-либо предложения?

1 Ответ

0 голосов
/ 23 апреля 2019

Я нашел хороший способ:

C #:

public Task<object> WithCallback(IDictionary<string, object> payload)
{
    Func<object, Task<object>> changed = (Func<object, Task<object>>)payload["changed"];
    return Task.Run(async () => await OnQuery(payload["request"], changed));
}

js:

var withCallback = edge.func({
    assemblyFile: '..dllUrl..',
    typeName: 'Electron.Wrapper.QueryWrapper',
    methodName: 'WithCallback' 
});

window.query = function (options) {
    function triggerResponse(error, result) {
        ...
    }

    withCallback({
        changed: (result) => triggerResponse(null, result),
        request: JSON.stringify(options)
    }, triggerResponse);
};

Когда вам нужен триггер при некоторых изменениях, вы должны использовать параметр 'Полезная нагрузка 'в функции OnQuery:

public async Task<object> OnQuery(dynamic request, dynamic payload = null)
{
    ...
}

Затем OnQuery возвращает значение, которое вы можете снова вызвать обратным вызовом js следующим образом:

payload("Notify js callback!");

Надеюсь, это кому-нибудь поможет!

...