在远程控制的Visual Studio实例中访问Visual Studio MEF组件/ IComponentModel

问题描述 投票:2回答:1

对于集成测试场景,我试图远程启动/控制Visual Studio实例并访问其一些公共MEF组件。

启动和控制实例并通过DTE访问服务工作正常:

var dte = Activator.CreateInstance(Type.GetTypeFromProgID("VisualStudio.DTE.15.0", true), true) as DTE;
ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;

什么是行不通的是获得IComponentModel的标准方法,GetService()可用于访问MEF组件。 null返回一些东西,但演员阵容导致var componentModel = sp.GetService(typeof(SComponentModel)) as IComponentModel

Microsoft.VisualStudio.ComponentModelHost

是否有其他方式可以访问MEF组件,或者是否不支持此方案?

c# visual-studio integration-testing envdte visual-studio-sdk
1个回答
1
投票

在尝试运行我在SSMS 18上为SSMS 17编写的扩展时,我遇到了类似的问题。在我的解决方案中,引用了var componentModel = serviceProvider.GetService(typeof(SComponentModel)); 版本14.0.0.0,当它在SSMS 17上运行时,一切正常。这条线:

Microsoft.VisualStudio.ComponentModelHost.ComponentModel

Microsoft.VisualStudio.ComponentModelHost.Implementation版本14.0.0.0程序集返回了componentModel.GetType() 的一个实例。运行时:

{Name = "ComponentModel" FullName = "Microsoft.VisualStudio.ComponentModelHost.ComponentModel"}
    Assembly: {Microsoft.VisualStudio.ComponentModelHost.Implementation, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a}
...

在立即窗口中我会得到:

Microsoft.VisualStudio.ComponentModelHost

但是当在SSMS 18上调试相同的扩展(来自引用var serviceProvider = serviceProvider.GetService(typeof(SComponentModel)); 版本14.0.0.0的相同解决方案)时,该行:

componentModel.GetType()

{Name = "ComponentModel" FullName = "Microsoft.VisualStudio.ComponentModelHost.ComponentModel"}
    Assembly: {Microsoft.VisualStudio.ComponentModelHost.Implementation, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a}
...

从较新的程序集返回和实例。

IComponentModel

当试图将它投射到Microsoft.VisualStudio.ComponentModelHost时,演员会失败。我的解决方案是在解决方案中引用IComponentModel版本15.0.0.0,因为qazxswpoi接口来自该程序集。

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.