Невозможно вызвать код c # из vbscript - ошибка ActiveX

Я пытаюсь вызвать метод, написанный на C #, из VBScript.

Я выполнил практически все инструкции, которые можно найти в Интернете, и у меня все еще возникают проблемы.

Конкретно я получаю

Ошибка: компонент ActiveX не может создать объект

Код объявления: 800A01AD.

Пока что я сделал следующее:

  1. Установить ComVisible(true)
  2. Зарегистрировано с использованием regasm /codebase
  3. Сильно назвал мою сборку
  4. Подтверждено, что он находится в реестре и указывает правильное местоположение
  5. Сделал класс публичным
  6. Нет статических методов
  7. Сделал метод, который я хочу назвать общедоступным
  8. Имейте конструктор без параметров
  9. Явно определил GUID

Мой VBScript выглядит так:

set oObject = CreateObject("TTTTTT.FFFFF.CCCCCCCCC")

Мой код на C # выглядит так:

using System;
using System.IO;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace XXXXX.YYYYY
{
    [ComVisible(true)]
    [Guid("3EB62C37-79BC-44f7-AFBD-7B8113D1FD4F")]
    [ProgId("TTTTTT.FFFFF.CCCCCCCCC")]
    public class CCCCCCCCC
    {
        public void MyFunc()
        {
            //
        }
    }
}

Кто-нибудь может помочь?


person Grant    schedule 14.11.2009    source источник
comment
Не могли бы вы опубликовать объявление класса для класса C #, включая объявление включающего пространства имен и любые атрибуты класса?   -  person itowlson    schedule 14.11.2009
comment
Привет, я обновил свой вопрос своим кодом.   -  person Grant    schedule 14.11.2009
comment
Вы видели stackoverflow .com / questions / 769332 /?   -  person abatishchev    schedule 22.06.2010


Ответы (5)


Вот простой проект, состоящий всего из нескольких шагов, для начала.

Код C #:

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly:System.CLSCompliant(true)]
[assembly: ComVisible(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b0")]

namespace Cheeso.ComTests
{
    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b1")]
    public class TestReply
    {
        public string salutation;
        public string name;
        public string time;
    }

    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b2")]
    public class TestObj
    {
        // ctor
        public TestObj () {}

        public TestReply SayHello(string addressee)
        {
            return SayHello(addressee, "hello");
        }

        public TestReply SayHello(string addressee, string greeting)
        {
            string x = String.Format("{0}, {1}!", greeting, addressee);
            Console.WriteLine("{0}", x);

            TestReply r = new TestReply
            {
                salutation = greeting,
                name = addressee,
                time = System.DateTime.Now.ToString("u")
            };
            return r;
        }
    }
}

Клиентский код VBScript:

Function Main()
    Dim obj
    Dim reply
    set obj = CreateObject("Cheeso.ComTests.TestObj")
    Set reply = obj.SayHello("Evgeny")
    WScript.Echo "Reply at: " & reply.time
    Set reply = obj.SayHello_2("Evgeny", "wassup")
    WScript.Echo "Reply at: " & reply.time
End Function

Main

Строить:

(produce your .snk file, once)
csc.exe /t:library /debug+ /keyfile:Foo.snk /out:TestObj.dll TestObj.cs
regasm /codebase TestObj.exe

Затем просто запустите vbscript (через cscript.exe).

Как только вы начнете работать, вы можете настроить его, добавить GAC, сделать typelib явным, добавить явный ProgId и так далее.

ps: К вашему сведению, этот пример показывает, что происходит с перегруженными методами .NET в классе, зарегистрированном для взаимодействия. К имени метода добавлен неявный _2 (_3, _4 и т. Д.).

person Cheeso    schedule 14.11.2009
comment
В ОС x64 вам может потребоваться создать файл .reg с помощью параметра / regfile в regasm, а затем импортировать его вручную. В противном случае в реестре не было соответствующих ключей CLSID \ {GUID} - они находились в HKCR \ Wow6432Node \ CLSID \ {GUID} - person Maciej Wozniak; 11.04.2014

Вы читали эту статью: COM Interop Exposed

На последней странице (3) статьи есть список:

  1. Определите интерфейс .NET для методов, которые вы хотите предоставить COM.
  2. Назначьте GUID этому интерфейсу с помощью атрибута «Guid».
  3. Пусть ваш класс реализует ваш интерфейс как первый интерфейс.
  4. Назначьте GUID этому классу с атрибутом «Guid».
  5. Добавьте атрибут «ClassInterface(ClassInterfaceType.None)», чтобы запретить regasm / tlbexp создать пустой интерфейс по умолчанию.
  6. Жестко запрограммируйте конкретный номер версии в атрибуте AssemblyVersion.
  7. Создайте пару ключей строгого имени для своей сборки и укажите на нее через атрибут AssemblyKeyFile.
  8. Добавьте свою сборку в GAC,
  9. Зарегистрируйте свою сборку для COM с помощью команды REGASM вместе с параметром «/ tlb» для создания библиотеки типов COM.

Я не уверен, что GAC и ClassInterfaceType.None являются недостающими частями вашей головоломки, возможно, вы захотите попробовать. Удачи!

person o.k.w    schedule 14.11.2009
comment
спасибо за ваш ответ o.k.w. Я проверил все пункты в статье и, к сожалению, все еще получаю ту же ошибку. - person Grant; 14.11.2009
comment
Возможно, вы сможете с нуля написать компонент из этих примеров кода и посмотреть, работает ли он. Если это не так, возможно, проблема в другом, а не в вашем коде. Извините, я не смог предложить больше помощи. - person o.k.w; 14.11.2009

В вашем коде нет ничего плохого, и, судя по звуку, вы следовали правильной процедуре установки. Однако полученный код ошибки ясно указывает на то, что интерпретатор сценария не может найти или загрузить сборку. Лучший способ устранить это - использовать утилиту ProcMon от SysInternals.

Я без проблем запустил ваш код, это были самые актуальные записи в журнале ProcMon:

22  12:04:41.1795038 PM WScript.exe 55280   RegOpenKey  HKCR\TTTTTT.FFFFF.CCCCCCCCC SUCCESS Desired Access: Read
26  12:04:41.1795682 PM WScript.exe 55280   RegOpenKey  HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID   SUCCESS Desired Access: Read
29  12:04:41.1796996 PM WScript.exe 55280   RegQueryValue   HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID\(Default) SUCCESS Type: REG_SZ, Length: 78, Data: {3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}
34  12:04:41.1797653 PM WScript.exe 55280   RegOpenKey  HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}   SUCCESS Desired Access: Read
62  12:04:41.1802539 PM WScript.exe 55280   RegOpenKey  HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32    SUCCESS Desired Access: Read
71  12:04:41.1804181 PM WScript.exe 55280   RegQueryValue   HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\(Default)  SUCCESS Type: REG_SZ, Length: 24, Data: mscoree.dll
824 12:04:41.2425662 PM WScript.exe 55280   RegQueryValue   HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\1.0.0.0\CodeBase   SUCCESS Type: REG_SZ, Length: 124, Data: file:///c:/projects/ClassLibrary2/obj/Debug/ClassLibrary2.DLL
... Lots of .NET keys...
1239    12:04:41.2970169 PM WScript.exe 55280   CreateFile  C:\projects\ClassLibrary2\obj\Debug\ClassLibrary2.dll   SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
person Hans Passant    schedule 14.11.2009

Чтобы пример Cheeso работал на 64-битной платформе, убедитесь, что вы вызываете CScript.exe как:

%windir%\SysWOW64\cscript.exe test.vbs

Ссылка: Невозможно использовать CreateObject из сценариев VB в Windows 7 x64

person atomsmith    schedule 27.10.2013

Может быть, все ваши проблемы вызваны VS. Попробуйте скомпилировать свою библиотеку из командной строки, набрав

csc.exe /t:library AClass.cs /keyfile:Foo.snk - produce your key file with VS!
regasm /codebase /tlb AClass.dll

VS добавляет что-то вроде / warn: / noconfig и т. Д., А также добавляет ссылки на другие сборки, такие как System.Core и т. Д., И иногда вызывает ошибки. Для меня компиляция из csc работала.

person VMAtm    schedule 17.12.2009