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

StackOverflow https://stackoverflow.com/questions/368001

Вопрос

У меня есть сборка .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 ?Идентификатор обратной связи=120882

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top