【发布时间】:2016-12-06 16:44:12
【问题描述】:
我们有一个名为 GenerateProxies.tt 的 C# T4 文件,它调用了几个命令行代码生成实用程序。使用 System.Diagnostics Process 类,我们将标准输出重定向到 T4 输出文本文件 (GenerateProxies.txt),以便我们可以查看命令行输出是否有错误。
我在 T4 的末尾添加了以下简单代码,以便 Visual Studio 将打开生成的文本文件作为该过程的最后一步(workingDirectory 变量在模板的前面声明和填充)。这确实有效,但会引发序列化错误。这个错误可以避免吗?
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#
IServiceProvider vssp = (IServiceProvider)this.Host;
DTE dte = vssp.GetService(typeof(DTE)) as DTE;
dte.ItemOperations.OpenFile(
string.Format(@"{0}\GenerateProxies.txt", workingDirectory),
Constants.vsViewKindTextView
);
#>
同样,这确实工作,它打开了文本文件,但它产生了这个错误:
Running transformation: System.Runtime.Serialization.SerializationException:
Type 'Microsoft.VisualStudio.Platform.WindowManagement.DTE.WindowBase' in
Assembly 'Microsoft.VisualStudio.Platform.WindowManagement'
is not marked as serializable.
【问题讨论】:
-
调用堆栈可能会有所帮助。
-
是的,但不幸的是,它来自一个完全没有外部访问权限的开发虚拟机(这就是为什么我没有费心重新输入所有程序集信息、密钥 GUID 等的原因)。调用堆栈很大,但看起来像是某种 PInvoke 编组问题。显然 DTE 是 COM。我隐约怀疑这是线程问题。
-
在我看来,有些东西被意外拉过 AppDomain 边界。调用堆栈可以识别来源,并且您可以在堆栈中的代码底部调查谁引用了该类型的实例。
-
我有类似的问题,请参阅我的回答,评论不允许有那么多字符
标签: c# visual-studio-2015 t4 envdte