0

我需要在我的 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 事件。

我发现这种方法可以解决我的问题,但我认为这不是正确的方法,因为我需要一个Electron的类库,而且我不知道如何将它与以前的方法一起使用,并且可能我不需要 WebSocketServer。

.Net 和 js 示例将受到重视。

谢谢,安德里亚

更新 1 我找到了这种方式,冷是正确的吗?我正在尝试实施.net,有什么建议吗?

4

1 回答 1

2

我找到了一个好方法:

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)
{
    ...
}

接下来 OnQuery 返回值,您可以通过这种方式再次调用 js 回调:

payload("Notify js callback!");

我希望这可以帮助某人!

于 2019-04-23T07:06:15.387 回答