Возникли проблемы при регистрации сборки для COM - PullRequest
1 голос
/ 28 июля 2010

Я создал простой проект библиотеки классов в Visual Studio 2008, в котором есть один класс, как показано ниже.Я пытаюсь заставить этот класс регистрироваться для взаимодействия COM, чтобы я мог использовать его через неуправляемые скрипты, такие как vbscript или jscript.

В свойствах сборки моего проекта я установил флажок «Зарегистрироваться для взаимодействия COM».

В настройках сборки я установил флажок «Сделать эту сборку видимой для COM» и подтвердил наличие атрибута [assembly: ComVisible(true)] в файле assembly.cs.

Каждый раз, когда я строю этот проект, я получаю сообщение об ошибке «projectname.dll не содержит никаких типов, которые могут быть зарегистрированы для COM-взаимодействия. Кроме того, я не смог успешно создать экземпляр класса 1используя vbscript. Кто-нибудь знает, что это не регистрируется должным образом?

Мой vbscript не может создать объект activex в этой строке ... Set F = CreateObject("64BitCLTest.Class1").

Наконец, как мне получить VSзарегистрировать это в 64-битной области реестра вместо 32-битной, чтобы 64-битные процессы могли использовать ее?

-- The Test Class--
namespace _64BitCLTest
{
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("64BitCLTest.Class1")]
    public class Class1
    {
        Class1()
        {
            // do nothing
        }

        public string Method1()
        {
            return "This is a return string from method 1";
        }

        public int Property1
        {
            get {return 777;}
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 28 июля 2010

вам нужно пометить конструктор public:

-- The Test Class--
namespace _64BitCLTest
{
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("64BitCLTest.Class1")]
    public class Class1
    {
        public Class1()
        {
            // do nothing
        }

        public string Method1()
        {
            return "This is a return string from method 1";
        }

        public int Property1
        {
            get {return 777;}
        }
    }
}
0 голосов
/ 29 июля 2010

Этот ответ состоит из двух частей.Первая проблема, по словам консультанта, заключалась в том, что у меня не было конструктора, помеченного как открытый.

Второй ответ заключается в том, что в VS2008 есть ошибка (я считаю), из-за которой сборки никогда не регистрируются в 64-битном разделе реестра, даже если проект установки настроен для целевой платформыx64.

Я установил VS2010, пересобрал точно такой же проект и запустил установку.Сборка была зарегистрирована отлично, и я смог успешно получить к ней доступ через COM, используя 64-битный процесс.Я до сих пор не нашел решения для этого в VS2008.

...