GetExportedValues <MyType> ничего не возвращает, я вижу части
У меня странная проблема с MEF, я проверил это в тестовом проекте, и все это, кажется, работает довольно хорошо, но по какой-то причине не работает в реальном проекте
Это код экспорта
public void RegisterComponents()
{
_registrationBuilder = new RegistrationBuilder();
_registrationBuilder
.ForTypesDerivedFrom(typeof(MyType))
.SetCreationPolicy(CreationPolicy.NonShared)
.Export();
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyType).Assembly, _registrationBuilder));
var directoryCatalog = new DirectoryCatalog(PathToMyTypeDerived, _registrationBuilder);
catalog.Catalogs.Add(directoryCatalog);
_compositionContainer = new CompositionContainer(catalog);
_compositionContainer.ComposeParts();
var exports = _compositionContainer.GetExportedValues<MyType>();
Console.WriteLine("{0} exports in AppDomain {1}", exports.Count(), AppDomain.CurrentDomain.FriendlyName);
}
Счетчик экспорта равен 0:(Есть идеи почему?
В файле журнала у меня много этого
System.ComponentModel.Composition Информация: 6: ComposablePartDefinition SomeOthertype было проигнорировано, поскольку оно не содержит экспорт.
Хотя я думаю, что это нормально, потому что я не был заинтересован в экспорте someOtherType
ОБНОВЛЕНИЕ: Я нашел эту ссылку, но после отладки я не стал мудрее, но, возможно, я не следую должным образом.
Спасибо за любые указатели
ура
1 ответ
У меня была та же проблема, и эта статья мне очень помогла.
Он описывает различные причины, по которым решение может потерпеть неудачу. Одним из наиболее важных является то, что зависимость типа, который вы хотите разрешить, не зарегистрирована.
Что мне очень помогло, так это вывод трассировки, который записывается в окно вывода при отладке приложения. Он точно описывает причины, по которым тип не может быть разрешен.
Даже с этим выходом. Вам, возможно, придется немного покопаться, потому что я получил только один уровень.
Пример:
Я хотел разрешить тип A, и я получил сообщение, подобное этому:
System.ComponentModel.Composition Предупреждение: 1: ComposablePartDefinition 'Namespace.A' было отклонено. Состав остается неизменным. Изменения были отклонены из-за следующих ошибок: Композиция вызвала множественные ошибки композиции с одной первопричиной. Коренные причины приведены ниже. Просмотрите свойство CompositionException.Errors для получения более подробной информации.
1) Не было найдено ни одного экспорта, соответствующего ограничению: Name NaceName_Name_Name_IB. RequireTypeIdentity Namespace.IB.
В результате: Невозможно установить импорт 'Namespace.A..ctor (Parameter="b", ContractName="namespace.IB") "для части" Пространство имен A ". Элемент: Namespace.A..ctor (Parameter="b", ContractName="Namespace.IB") -> Namespace.A -> AssemblyCatalog (Assembly="сборка, версия =0.0.0.0, культура = нейтральная, PublicKeyToken знак равно
Но я ясно видел часть для Namespace.IB
, Итак, в отладчике я попытался решить эту проблему. И я получил еще один вывод трассировки. На этот раз он сказал мне, что моя реализация Namespace.IB
не может быть решен, потому что для одного из его импортов отсутствовал экспорт, поэтому в основном то же сообщение, что и выше, только с разными типами. И на этот раз я не нашел части для этого недостающего импорта. Теперь я знал, какой тип был настоящей проблемой, и выяснил, почему для него не было регистрации.