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

C# 如何使用t4模板中的roslyn解析当前解决方案?,c#,visual-studio-2015,t4,roslyn,C#,Visual Studio 2015,T4,Roslyn,如何从T4模板中获取当前会话的VisualStudioWorkspace实例?我希望它能够解析当前解决方案(即.tt文件所在的解决方案)中的源文件 从VS包中,我可以使用GetService(scoComponentModel)并从中获取工作区实例,但在使用以下代码时,这似乎会在T4文件中生成错误: IServiceProvider serviceProvider = (IServiceProvider)this.Host; var comp = serviceProvider.GetServi

如何从T4模板中获取当前会话的
VisualStudioWorkspace
实例?我希望它能够解析当前解决方案(即.tt文件所在的解决方案)中的源文件

从VS包中,我可以使用
GetService(scoComponentModel)
并从中获取工作区实例,但在使用以下代码时,这似乎会在T4文件中生成错误:

IServiceProvider serviceProvider = (IServiceProvider)this.Host;
var comp = serviceProvider.GetService(typeof(SComponentModel)) as IComponentModel;
返回的错误为:
System.Runtime.Serialization.SerializationException:在程序集“Microsoft.VisualStudio.ComponentModelHost.ComponentModel”中键入“Microsoft.VisualStudio.ComponentModelHost.Implementation”,版本=14.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'未标记为可序列化。

您可以通过设置
hostspecific=“true”
从T4访问VS
IServiceProvider
,然后将
此.Host
强制转换为
IServiceProvider


但是,这实际上是行不通的,因为T4代码在单独的AppDomain中运行,而MEF和Roslyn对象无法使用它。将
MarshallByRefObject
注入主VS AppDomain可能会起作用。

IIRC,T4不会在VS进程中运行;这可能不可能,嗯。。这听起来很烦人,而且有点奇怪。毕竟,您可以在T4模板中从DTE访问FileCodeModel,我还以为这是在Roslyn之上实现的呢?要么我错了,要么这只能通过跨进程COM编组来实现。这太令人失望了。因此,在这种情况下,VSPackage中的单个文件生成器是生成代码的唯一选项,在这种情况下,要求每个开发人员安装VS扩展?我完全错了。是的,我知道这一点。但是,如果我尝试获取
scoComponentModel
服务(获取
VisualStudioWorkspace
),我会收到一个错误,说某些类型不可序列化。我用我使用的代码和得到的错误更新了问题。@decf:Ah;它看起来像T4在一个单独的AppDomain中运行(这是有意义的,因为它应该被卸载)。除非您编写一个
MarshallByRefObject
包装器并将其加载到原始AppDomain中(这可能不容易),否则您就不走运了。我想我必须将生成代码作为VSIX包来编写。如果你用这个信息更新你的答案,我会把这个问题标记为已回答。谢谢你的意见!