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

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

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

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

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

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

Ответ 1

Самое близкое, что я получил к решению, это что-то вроде следующего:

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 в конструктор и обернуть остальные вызовы объекту, но, вероятно, не обязательно для тестового кода.

Ответ 2

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

Ответ 3

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