如何从T4模板中获取当前会话的VisualStudioWorkspace
实例?我希望这能够解析当前解决方案中的源文件(即.tt文件所在的解决方案)。
从VS包中我可以使用GetService(SComponentModel)
并从中获取工作空间实例,但是当使用以下代码时,这似乎在T4文件中生成错误:
IServiceProvider serviceProvider = (IServiceProvider)this.Host;
var comp = serviceProvider.GetService(typeof(SComponentModel)) as IComponentModel;
返回的错误是:
System.Runtime.Serialization.SerializationException: Type 'Microsoft.VisualStudio.ComponentModelHost.ComponentModel' in Assembly 'Microsoft.VisualStudio.ComponentModelHost.Implementation, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
答案 0 :(得分:1)
您可以设置IServiceProvider
,然后将hostspecific="true"
投射到this.Host
,从T4访问VS IServiceProvider
。
然而,这实际上不起作用,因为您的T4代码在单独的AppDomain中运行,并且MEF和Roslyn对象将无法使用它。将MarshalByRefObject
注入主VS AppDomain可能有效。