MEF не находит детали в других сборках - PullRequest
7 голосов
/ 26 марта 2010

Мне не хватает чего-то простого, когда дело доходит до использования MEF. Я получил его с помощью примеров и простого консольного приложения, где все в одной сборке. Затем я поместил некоторые операции импорта и экспорта в отдельный проект, который содержит различные объекты. Я хочу использовать эти объекты в MS Test, но на самом деле состав никогда не выполняется. Когда я перемещаю композиционные материалы в конструктор рассматриваемой сущности, это работает, но это явно неправильно. GetExecutingAssembly только «видит» процесс тестирования? Что мне не хватает re контейнеров? Я попытался положить контейнер в использование в тесте без удачи. Документы MEF все еще очень скудны, и я не могу найти простой пример приложения (или MS Test), в котором используются объекты из другого проекта ...

Ответы [ 2 ]

9 голосов
/ 27 марта 2010

В .NET каждый exe-файл или DLL-файл называется сборкой 1 . Поэтому, когда вы создаете каталог на основе «исполняемой сборки» и используете его в точке входа приложения, вы включаете только те части, которые определены в exe-проекте. Вы не получите никаких частей, определенных в DLL.

Попробуйте заменить это:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

этим:

var catalog = new AggregateCatalog(
    new ComposablePartCatalog[]
    {
        new AssemblyCatalog(Assembly.GetExecutingAssembly()),
        new DirectoryCatalog(".")
    });

edit: Я только что обнаружил, что есть более простое решение:

var catalog = new DirectoryCatalog(".", "*");

( 1 ) Собственно, сборка может состоять из нескольких файлов, но это редко используется. Термин также используется для параллельного COM.

3 голосов
/ 26 марта 2010

Да. Вы должны убедиться, что добавили свою сборку (сборку с импортом и экспортом) в каталог перед составлением. Таким образом, он может найти соответствующие детали.

GetExecutingAssembly делает именно то, что говорит - он получает сборку, которая выполняется в данный момент, что означает ту, в которой написан этот конкретный код. В вашем случае это тестовая сборка, а не ваш "библиотечный" проект.

Пусть ваш тест явно добавит проект библиотеки в каталог, и он, скорее всего, будет работать так, как вы ожидаете.

...