poc*_*sar 10 .net c# fingerprint node.js edge.js
我正在尝试使用node.js应用程序与名为U.are.U的.NET SDK指纹识别器进行交互.SDK提供.dll(win32和x64),Java和.NET库.我决定使用.NET简单易用,所有接口都可以使用.
所以,我面临的当前问题是如何调用这些.NET函数并仍然保留node.js的异步性质.应用程序流程(在.NET示例中)非常简单,对库进行3次调用,指纹完成.
private IEnumerable<Fmd> CaptureAndExtractFmd()
{
while (!reset)
{
DataResult<Fmd> resultConversion;
try
{
if (count >= 8)
{
SendMessage("Enrollment was unsuccessful. Please try again.");
count = 0;
break;
}
Fid fid = null;
if (!_sender.CaptureFinger(ref fid))
break;
if (fid == null)
continue;
count++;
resultConversion = FeatureExtraction.CreateFmdFromFid(fid, Constants.Formats.Fmd.ANSI);
SendMessage("A finger was captured. \r\nCount: " + (count));
if (resultConversion.ResultCode != Constants.ResultCode.DP_SUCCESS)
break;
}
catch (Exception)
{
break;
}
yield return resultConversion.Data;
}
}
Run Code Online (Sandbox Code Playgroud)
我如何更改它以便它可以在node.js中使用,而不是.NET gui程序?
还需要注意的是,node.js并不总是在.NET程序上调用函数来接收函数.程序的识别部分是异步发生的,并且当有人将手指放在指纹识别器上时会被启动,这意味着node.js部分不知道何时会发生这种情况.所以我不能一直依赖于询问.NET部分的数据,它必须在没有被问到的情况下调用node.js上的回调.所以基本上,这是一种双向通信,不仅仅是根据请求,因为请求使用网络服务器会容易得多.
我找到了一个node.js库,它可以缩小.NET和node.js之间的差距,称为edge.js,这会有什么帮助吗?
基本上,edge.js可以使它与node-webkit(我将运送我的应用程序)一起工作,我可以直接在页面中调用节点API,因此我可以根据库中的结果更新DOM .我需要能够通过发出事件或调用回调来注册一个异步任务,该任务可以从CLR内部通知给node.js对等方!
根据edge.js作者,它可以轻松完成https://github.com/tjanczuk/edge/issues/54#issuecomment-17967082我只是没有足够的.NET技能(从一个完整的模块) )与所有回调.
自从这个问题发布以来很长一段时间后,我可以使用节点事件发射器轻松使用edge.js在我的.NET UI中进行输入和输出通信(甚至可以从.NET UI控制node-webkit内的node.js):
// demo basic code in node.js
var
edge = require('edge'),
Bridge = edge.func('../path/to/compiled.dll'),
callback,
ev = new require('events').EventEmitter();
ev.on('acquire', function(fingerdata){
console.log(fingerdata);
});
ev.on('error', function(){
});
callback = function(event, report){
// report the result of the event emitter back to .NET
// you can even pass the "report" to the event handler, so you can return anything you want back to .NET, not just a boolean
report(null, ev.emit(event.name, event.data));
//ev.emit(event.name, {data: event.data, report: report});
};
var bridge = Bridge(callback, true);
// calling bridge(null, true); "releases" my device, should be called on process.on('exit')
Run Code Online (Sandbox Code Playgroud)
现在您可以使用事件从 .NET 调用输入/输出,而不是调用本机代码(这可能不是线程安全的)
namespace Bridge
{
public class Startup
{
public async Task<object> Invoke(Func<object, Task<object>>callback)
{
Bridge.Base.setCallback(callback);
MainForm mainForm = new Bridge.MainForm();
Task.Run(async () =>
{
Application.Run(mainForm);
});
return (Func<object, Task<object>>)(async (i) => { Bridge.Base.release(); return null; });
}
}
}
// inside Bridge.Base
static public void setCallback(Func<object, Task<object>> cb)
{
if (callback == null)
{
callback = cb;
}
}
static public async void Emit(string name, object data)
{
return await Task.Run(async () =>
{
return await callback(new {
name = name,
data = data
});
});
}
static public Func<object, Task<object>> callback = null;
Run Code Online (Sandbox Code Playgroud)
现在可以Emit('error', "My error")从任何地方异步调用我的派生类Base。请注意,我最近开始使用 C#,这里提供的代码可能不是最合适的。