COM-компонент не остается доступным в VBScript - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть проект библиотеки классов 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.DLL регистрируется с использованием 32-разрядного C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /codebase COMTest.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()?

1 Ответ

2 голосов
/ 21 февраля 2012

Двоеточие, которое вы используете в третьей строке, на самом деле ничего не делает, оно просто разделяет два разных утверждения.Ваш Dim foo : CreateObject("COMTest.Foo") эквивалентен:

Dim foo
CreateObject("COMTest.Foo")

, который создает объект, но фактически не устанавливает его ссылку на какую-либо переменную.Я бы написал так:

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