如何使用t4模板中的roslyn来解析当前的解决方案?

时间:2015-09-16 13:22:21

标签: c# visual-studio-2015 t4 roslyn

如何从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.

1 个答案:

答案 0 :(得分:1)

您可以设置IServiceProvider,然后将hostspecific="true"投射到this.Host,从T4访问VS IServiceProvider

Details

然而,这实际上不起作用,因为您的T4代码在单独的AppDomain中运行,并且MEF和Roslyn对象将无法使用它。将MarshalByRefObject注入主VS AppDomain可能有效。