对于集成测试场景,我试图远程启动/控制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组件,或者是否不支持此方案?
在尝试运行我在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接口来自该程序集。
希望能帮助到你