我需要在我的 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,有什么建议吗?
我找到了一个好方法:
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!");
我希望这可以帮助某人!