COM组件没有';t在VBScript中保持可访问性

本文关键字:VBScript 访问 组件 COM | 更新日期: 2023-09-27 18:25:15

我有一个C#类库项目(dll),它只有一个类COMTest:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace COMTest
{
    [Guid("45D639E4-FDDE-4b7b-A35F-FC19856DFF24")]
    [ComVisible(true)]
    public class Foo
    {
        public Foo()
        {
            Console.WriteLine("Constructing Foo");
        }
        private string mName = "FOO";
        public string Name
        {
            get { return mName; }
            set { mName = value; }
        }
    }
}

该项目已注册为COM互操作,并且程序集在COM中可见。目标框架是.Net 3.5,平台目标是x86。使用32位C:'Windows'Microsoft.NET'Framework'v2.0.50727'RegAsm.exe /codebase COMTest.dll 注册.dll

我正试图从VBScript(同样是32位,使用C:'Windows'SysWOW64'cscript.exe test.vbs)访问此类,但在脚本中获取Foo的实例时似乎遇到了问题。我可以使用该类;我就是记不起它了。

这是我的脚本:

Wscript.Echo "CreateObject(""ComTest.Foo"").Name Results: " + CreateObject("COMTest.Foo").Name
IF IsEmpty(CreateObject("COMTest.Foo")) THEN Wscript.Echo "CreateObject() is empty" ELSE Wscript.Echo "CreateObject() is NOT empty"
DIM foo : CreateObject("COMTest.Foo")
IF IsEmpty(foo) THEN Wscript.Echo "foo is empty" ELSE Wscript.Echo "foo is NOT empty"

这是输出:

Constructing Foo
CreateObject("ComTest.Foo").Name Results: FOO
Constructing Foo
CreateObject() is NOT empty
Constructing Foo
foo is empty

正如您所看到的,CreateObject()调用成功了——我只是无法保留对返回对象的引用(在foo中)。

我觉得我错过了一些简单的东西。如何保留从CreateObject()返回的对象?

COM组件没有';t在VBScript中保持可访问性

您在第三行中使用的冒号实际上没有任何作用,它只是分隔两个不同的语句。您的Dim foo : CreateObject("COMTest.Foo")相当于:

Dim foo
CreateObject("COMTest.Foo")

它创建了对象,但实际上并没有将其引用设置为任何变量。我会这样写:

Dim foo
Set foo = CreateObject("COMTest.Foo")
WScript.Echo foo.Name