我正在努力通过基于node.js运行edge.js的REST-API替换IE中的ActiveX-Implementation
到目前为止,页面实现的基本示例运行良好。我将index.js设置为
var edge = require('edge');
var edgeVb = require('edge-vb');
var path = require('path');
var helloVb = edge.func('vb', path.join(__dirname, 'simpleVbFunction.vb'));
helloVb('Testing with String', (err, res) => {
if(err) throw err;
console.log(res);
});
而simpleVbFunction.vb为
Async Function(Input As Object) As Task(Of Object)
Return Await Task.Run(Function()
Return "NodeJS Welcomes: " & Input.ToString()
End Function)
End Function
到目前为止一切顺利。现在我希望能够访问运行node.js的机器上运行的应用程序。在这种情况下,Catia(虽然也可以是Excel)
通常我会像这样使用simpleVbFunction.vb
Async Function(Input As Object) As Task(Of Object)
Return Await Task.Run(Function()
Dim CATIA as Object
set CATIA = GetObject(, "CATIA.Application")
Return CATIA.ActiveDocument.Application.FullName
End Function)
End Function
然而,这不起作用。我收到以下错误。
错误:无法编译VB代码。 ---->编译为CLR库时出错: C:\ Users \ xxxxxx \ AppData \ Local \ Temp \ 4hf2uw3z.0.vb(1,0):错误BC30203:Bezeichner erwartet。 ---->编译为CLR异步lambda表达式时出错: C:\ Users \ xxxxxx \ AppData \ Local \ Temp \ cypj4ltp.0.vb(7,0):错误BC30451:“GetObject”ist nicht deklariert。 Auf das Objekt kann aufgrund derSchutzstufemöglicherweisenichtzugegriffen werden。 在错误(本机) at Object.exports.func(C:\ Users \ xxxxxx \ coding \ node \ tst_win32ole \ node_modules \ edge \ lib \ edge.js:169:17) 在对象。 (C:\用户\ XXXXXX \编码\节点\ tst_win32ole \ index.js:6:20) 在Module._compile(module.js:570:32) 在Object.Module._extensions..js(module.js:579:10) 在Module.load(module.js:487:32) 在tryModuleLoad(module.js:446:12) 在Function.Module._load(module.js:438:3) 在Timeout.Module.runMain [as _onTimeout](module.js:604:10) 在ontimeout(timers.js:386:14)
现在我必须管理我的VB.NET技能有点生疏,这可能只是我的VB代码中的一个错误,但我认为这是另一回事。有没有人能够通过edge.js访问COM-Object,如果是,这怎么可能?
[编辑] 好。我通过从VB切换到C#来进一步(至少注释掉的代码以访问Excel应用程序的名称)。但这开启了另一个问题。我的代码在这里看起来像这样
using System.Threading.Tasks;
using System;
using System.Runtime.InteropServices;
// using INFITF;
public class Startup
{
public async Task<object> Invoke(object input)
{
// dynamic xl = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
// return xl.Name;
object CATIA0 = Marshal.GetActiveObject("CATIA.Application");
INFITF.Application CATIA = CATIA0 as INFITF.Application;
}
}
现在的问题是,当使用Visual Studio并编译dll时会自动包含(当将CATIA设置为INFITF.Application时)。但是使用edge.js我会收到无法找到名称空间INFITF的错误。任何想法如何工作?
很抱歉这个问题很长。在解决这个问题之后我会整理一下。
[/编辑]
答案 0 :(得分:3)
行。我想出了大部分内容。首先,因为您没有使用IDE,并且您不会像以前一样添加Ressources,因此这将与edge.js的工作方式不同。你必须找到你的DLL并实现它。在我的情况下,我必须找到
Interop.INFITF.dll
来自Catia目录。
之后你的node.js代码将如下所示。 (我现在测试的功能就是每秒一次我会记录Catia当前打开的部件的名称)
var edge = require('edge');
var path = require('path');
var getCat = edge.func({
source: path.join(__dirname, 'accessCatia.cs')
, references :[
'./Resources/Interop.INFITF.dll'
]});
setInterval(function(){
getCat('someInputString', (err, res)=>{
if(err){
console.log('ERROR FOUND: ');
console.log(err);
return;
}
console.log(res);
});
},1000);
我的accessCatia.cs看起来像这样。
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System;
public class Startup
{
public async Task<object> Invoke(object input)
{
object cat0 = Marshal.GetActiveObject("Catia.Application");
INFITF.Application cat = cat0 as INFITF.Application;
INFITF.Document doc = cat.ActiveDocument as INFITF.Document;
return doc.FullName;
}
}
现在仍然开放的是收到的对象看起来与你在VB.net或Internet Explorer中通过ActiveX获得的结构不同。例如
doc.FullName以常规方式存在,但在使用C#时将找不到doc.Name,而您必须使用doc.get_Name()。
不幸的是,DassaultSystems在文档方面非常糟糕,但这可能是另一个话题。