Можно ли протестировать COM-открытую сборку из .NET?

У меня есть сборка .NET, которую я предоставил COM через файл tlb, и установщик, который регистрирует tlb. Я вручную проверил, что установщик работает правильно и что клиенты COM могут получить доступ к библиотеке. Все идет нормально...

Однако я пытаюсь собрать несколько автоматических системных тестов, которые проверяют правильность работы установщика. В рамках этого я автоматизировал установку на виртуальную машину, и теперь я хочу сделать несколько вызовов установленной библиотеки COM, чтобы убедиться, что она работает правильно. Первоначально я думал о написании некоторых тестов на VB6, но у меня уже есть большой набор тестов, написанных на C #, которые ссылаются на сборку .NET. Я надеялся, что смогу изменить их, чтобы ссылаться на .tlb, но я получаю сообщение об ошибке, когда пытаюсь сделать это в VS2008:

Библиотека типов ActiveX blah.tlb была экспортирована из сборки .NET и не может быть добавлена ​​в качестве ссылки.

Есть ли способ обмануть VS2008, разрешив мне добавить эту ссылку, возможно, отредактировав файл tlb?

Поиск в Google не дал никаких решений. Все, что я нашел, - это статья Microsoft Connect, в которой говорится, что это «По замыслу»: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=120882


person Akash    schedule 15.12.2008    source источник
comment
Несколько человек упомянули об использовании tlbimp.exe. Если я попробую tlbimp.exe blah.tlb, я получаю сообщение об ошибке: Библиотека типов blah была экспортирована из сборки CLR и не может быть повторно импортирована как сборка CLR.   -  person Akash    schedule 15.12.2008


Ответы (3)


Ближайшее, что я нашел к решению, - это что-то вроде следующего:

using System;
class ComClass
{
    public bool CallFunction(arg1, arg2)
    {
        Type ComType;
        object ComObject;

        ComType = Type.GetTypeFromProgID("Registered.ComClass");
        // Create an instance of your COM Registered Object.
        ComObject = Activator.CreateInstance(ComType);

        object[] args = new object[2];
        args[0] = arg1;
        args[1] = arg2;

        // Call the Method and cast return to whatever it should be.
        return (bool)ComType.InvokeMember("MethodToCall", BindingFlags.InvokeMethod, null, ComObject, args))
    }
}

Это не очень красиво, но я думаю, что все понятно. Вы, конечно, можете поместить экземпляр ComObject в конструктор и обернуть остальные вызовы объекта, но, вероятно, это не обязательно для тестового кода.

person Warren    schedule 18.04.2011
comment
+1 для метода Type.GetTypeFromProgID, он может получить тип COM. Я пробовал, это работает (но есть ли практическая разница в прямом добавлении ссылки? Я не знаю). - person peenut; 30.08.2011
comment
methodCOM в этом примере фактически должна быть переменной ComType. - person glebd; 08.06.2012

Вы должны иметь возможность создать класс-оболочку для установленного COM-компонента с помощью TLBImp, а затем запустить свои тесты для этого. В основном вы будете писать сборку .Net, устанавливать ее в COM, а затем тестировать класс-оболочку, поэтому ваши тесты будут маршрутизироваться так, как если бы они были вызваны компонентом COM.

person Wolfwyrd    schedule 15.12.2008
comment
Эммм .. Нет! У вас не может быть управляемого COM-сервера и клиента. TlbImp просто выйдет из строя ... - person schwarz; 11.09.2019

Используя tlbimp.exe, вы можете создать сборку из вашего COM-компонента, который можно использовать в .NET-коде

person Darin Dimitrov    schedule 15.12.2008
comment
Нет, если компонент COM был создан на C # или другом языке .NET. - person John Saunders; 18.04.2011
comment
-1 причина такая же, как и в комментарии: нет, если компонент COM был создан на C # или другом языке .NET. - person peenut; 30.08.2011