Как заставить Punch (Cocktail) работать во внутреннем контейнере композиции Visual Studio?

Я пытаюсь использовать DevForce Punch в своем приложении Visual Studio 2017 Extensibility (VSIX). Экспорты MEF моего VSIX НЕ распознаются. Кажется, потому что VS использует свой собственный контейнер композиции. Как я могу интегрировать внутренний каталог контейнеров композиции Visual Studio в контейнер композиции Cocktail?

Например, если я получу ссылку на каталог Visual Studio по умолчанию:

var dte2 = (DTE2)Package.GetGlobalService(typeof(SDTE));
var sp = new ServiceProvider(dte2 as Microsoft.VisualStudio.OLE.Interop.IServiceProvider);
var container = sp.GetService(typeof(Microsoft.VisualStudio.ComponentModelHost.SComponentModel)) as Microsoft.VisualStudio.ComponentModelHost.IComponentModel;

var catalog = container.DefaultCatalog;

Как добавить этот каталог в Punch?

Или я должен получить доступ к DefaultExportProvider или DefaultCompositionService Visual Studio?

Не знаю, куда идти. Любое направление или идеи будут весьма признательны.

Спасибо !


person MrTouya    schedule 22.03.2018    source источник
comment
Возможно, вы сможете использовать DevForce CompositionHost, который лежит в основе расширяемости Punch. Вы можете напрямую добавить каталог, используя CompositionHost.Add(catalog). Если время для этого не подходит, вы также можете попробовать создать подкласс класса Punch CocktailMefBootStrapper, чтобы переопределить метод PrepareCompositionCatalog. Дополнительную информацию об этом см. на странице drc.ideablade.com/devforce. -2012/bin/view/Документация/.   -  person Kim Johnson    schedule 23.03.2018
comment
Спасибо, Кен. Я попробую создать подкласс CocktailMefBootStrapper и опубликую свои результаты :-)   -  person MrTouya    schedule 23.03.2018
comment
Привет Кен, ты крутой! Я смог заставить все работать, выполнив следующие действия: protected override ComposablePartCatalog PrepareCompositionCatalog() { AssemblyCatalog asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); CompositionHost.Add(asmCatalog); вернуть base.PrepareCompositionCatalog(); }. БЛАГОДАРНОСТЬ!!!!   -  person MrTouya    schedule 23.03.2018
comment
@MrTouya, рад узнать, что вы решили эту проблему, если возможно, вы могли бы поделиться своим решением в качестве ответа, а затем отметить его позже, чтобы это могло помочь другим членам сообщества, которые столкнулись с той же проблемой, что и ваша. Спасибо, что поделились :)   -  person Jack Zhai-MSFT    schedule 26.03.2018
comment
Привет Ким, Еще раз спасибо за помощь. Я обнаружил связанную проблему. Кажется, мне также нужно получить [InterfaceExport] от Devforce. Из-за внутренней обработки MEF в VS все, что помечено пользовательским атрибутом, игнорируется. Есть ли в Caliburn.Micro или Devforce средство, которое я могу переопределить, чтобы вручную получить [InterfaceExport] и добавить его в VS?   -  person MrTouya    schedule 29.03.2018


Ответы (1)


Мне удалось заставить Punch в Visual Studio распознавать экспорт MEF, внедрив следующий код:

protected override ComposablePartCatalog PrepareCompositionCatalog() 
{ 
        AssemblyCatalog asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
        CompositionHost.Add(asmCatalog); 
        return base.PrepareCompositionCatalog(); 
}

Еще раз спасибо Ким за вашу помощь! PS Извините, что ошибся в имени. Я только что понял, что ты НАСТОЯЩАЯ Ким Джонсон из IdeaBlade!!

person MrTouya    schedule 26.03.2018
comment
Вы можете пометить это как ответ, спасибо, что снова поделились своим решением. - person Jack Zhai-MSFT; 29.03.2018