【发布时间】:2015-12-13 02:44:49
【问题描述】:
如何从 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.
【问题讨论】:
-
IIRC,T4不在VS进程中运行;这可能是不可能的。
-
嗯.. 这听起来很烦人,而且有点奇怪。毕竟,您可以在 T4 模板中从 DTE 访问 FileCodeModel,而我认为这些天这是在 Roslyn 之上实现的?
-
要么我错了,要么只能通过跨进程 COM 编组工作。
-
这太令人失望了。那么在这种情况下,VSPackage中的单个文件生成器是这种情况下生成代码的唯一选择,需要每个开发人员都安装VS扩展?
-
我完全错了。
标签: c# visual-studio-2015 t4 roslyn