Ошибка автоматизации в VB 6.0 из класса C #

Я создал библиотеку классов C # и использую ее через приложение VB 6.0. Но когда я пытаюсь вызвать какой-либо метод (который возвращает строку), у меня возникает ошибка автоматизации. В остальном класс C # работает нормально.

Есть идеи, почему?


person Bhaskar    schedule 18.06.2009    source источник


Ответы (2)


Как говорит fbinder, вы должны строго подписать свою сборку и использовать некоторые атрибуты. Атрибуты, которые мы используем (успешно):

[ComVisible( true )]
[ClassInterface( ClassInterfaceType.None )]
[Guid( "00000000-0000-0000-0000-000000000000" )]
[ComDefaultInterface( typeof( IExposedClass ) )]
public class ExposedClass : IExposedClass
{
    //need a parameterless constructor - could use the default
    public ExposedClass() { }

    public string GetThing()
    {
        return "blah";
    }
}

[ComVisible( true )]
[Guid( "00000000-0000-0000-0000-000000000000" )]
[InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IExposedClass
{
    string GetThing();
}
person Ant    schedule 18.06.2009
comment
Я изменил свой код, чтобы он точно совпадал с вашим, но он выдает сообщение об ошибке - Функция или интерфейс помечены как ограниченные, или функция использует тип автоматизации, не поддерживаемый в Visual Basic - person Bhaskar; 19.06.2009
comment
Вы изменили атрибуты Guid, чтобы использовать свои собственные гиды? Я предлагаю, чтобы следующим шагом было открытие созданного вами tlb с помощью OleView (мой находится в c: \ Program Files \ Microsoft Visual Studio \ COMMON \ Tools \ OLEVIEW.EXE) и взглянуть на то, что RegAsm зарегистрировал для вас. Еще мысль - RegAsm выдает какие-нибудь предупреждения? - person Ant; 19.06.2009
comment
Я предполагаю, что тот факт, что вы приняли этот ответ, означает, что он сработал для вас. :) - person Ant; 30.07.2009

Вы должны жестко подписать свою библиотеку классов, зарегистрировать ее с помощью regasm и поместить это перед определением класса:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("Class GUID")]

Кроме того, вы должны определить интерфейс для предоставления желаемых методов. Интерфейс должен иметь атрибуты:

 [Guid("Interface GUID")]
 [ComVisible(true)]
person Fabio Vinicius Binder    schedule 18.06.2009
comment
Я сделал это. Я также создал файл tlb и добавил его в качестве ссылки в свой проект VB 6.0. Но я все равно получаю ту же ошибку. Я возвращаю строку из моего класса C # в свой VB 6.0. - person Bhaskar; 18.06.2009