Передача событий C # .NET с edge.js в Node.js для электрона

#javascript #c# #node.js #electron #edge.js

#javascript #c# #node.js #электронный #edge.js

Вопрос:

Мне нужно выполнить несколько вызовов из моего 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, которая иногда запускает асинхронные события, поэтому мне нужно найти способ прослушивания.СЕТЕВЫЕ события из js.

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

Будет оценен образец .Net и js.

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

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

Комментарии:

1. это зависит от того, насколько глубоко вы хотите связать nodejs и c #-код. Я могу придумать простое решение, такое как запись в файл, и код с обеих сторон может прослушивать изменения файла. Или вы можете использовать redis в качестве среднего моста

Ответ №1:

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

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!");
 

Я надеюсь, что это может кому-то помочь!