带有edge.js的GetObject

rel*_*one 6 javascript vb.net activex node.js edge.js

我正在努力通过基于node.js的REST-API替换IE中的ActiveX-Implementation,运行edge.js

到目前为止,页面实现的基本示例工作得很好.我将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);
});
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在我希望能够访问运行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
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我收到以下错误.

错误:无法编译VB代码.---->编译为CLR库时出错:C:\ Users\xxxxxx\AppData\Local\Temp\4hf2uw3z.0.vb(1,0):错误BC30203:Bezeichner erwartet.---->编译为CLR async lambda表达式时出错:C:\ Users\xxxxxx\AppData\Local\Temp\cypj4ltp.0.vb(7,0):错误BC30451:"GetObject"ist nicht deklariert.奥夫DAS OBJEKT卡恩aufgrund德Schutzstufemöglicherweisenicht zugegriffen werden.在Object处的Object.exports.func(C:\ Users\xxxxxx\coding \node\tst_win32ole \node_modules\edge\lib\edge.js:169:17)处出现错误(本机).(C:\ Users\xxxxxx\coding \node\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),位于Timeout.Module.runMain的Function.Module._load(module.js:438:3)[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;
       }
   }    
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当使用Visual Studio并编译dll时会自动包含(当将CATIA设置为INFITF.Application时).但是使用edge.js我会收到无法找到名称空间INFITF的错误.有任何想法如何工作?

很抱歉这个问题很长.在解决之后我会整理一下.

[/编辑]

rel*_*one 3

好的。我弄清楚了大部分。首先,由于您不使用 IDE,并且不会像以前那样添加资源,因此与 edge.js 的工作方式会有所不同。您必须找到您的 dll 并实现它。就我而言,我必须找到

互操作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);
Run Code Online (Sandbox Code Playgroud)

我的 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;

       }
   }
Run Code Online (Sandbox Code Playgroud)

现在仍然悬而未决的是,收到的对象似乎具有与通过 VB.net 或通过 Internet Explorer 中的 ActiveX 获得的对象不同的结构。例如

doc.FullName 正常存在,但使用 C# 时将找不到 doc.Name,而您必须使用 doc.get_Name()。

不幸的是,DassaultSystems 在文档方面相当糟糕,但这可能是另一个主题的内容。