使用 Node.js 中的 edge.js 处理电子的 C# .NET 事件

Handing C# .NET events with edge.js in Node.js for electron

我需要在我的 Electron 项目中从我的 js 调用我的 C# DLL,它以这种方式工作正常:

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 监听 .NET 事件的方法。

我发现 this way 可以解决我的问题,但我认为这不是正确的方法,因为我需要一个用于 Electron 的 class 库,但我不知道也不知道如何使用以前的方式使用它,可能我不需要 WebSocketServer。

一个 .Net 和 js 示例将被重视。

谢谢, 安德里亚

更新 1 我找到了 this way,冷是对的吗?我正在尝试实施 .net,有什么建议吗?

我找到了一个好方法:

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 函数中使用参数 'payload':

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

接下来的OnQueryreturn这个值你可以通过这种方式再次调用js回调:

payload("Notify js callback!");

希望对大家有所帮助!