Можно ли протестировать COM-сборку из .NET? - PullRequest
11 голосов
/ 15 декабря 2008

У меня есть сборка .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

Ответы [ 3 ]

12 голосов
/ 18 апреля 2011

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

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

0 голосов
/ 15 декабря 2008

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

0 голосов
/ 15 декабря 2008

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

...