我们有一个名为GenerateProxies.tt 的C# T4 文件,它调用多个命令行codegen 实用程序。使用 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
);
#>
再说一遍,这个does工作时,它打开文本文件,但会生成以下错误:
Running transformation: System.Runtime.Serialization.SerializationException:
Type 'Microsoft.VisualStudio.Platform.WindowManagement.DTE.WindowBase' in
Assembly 'Microsoft.VisualStudio.Platform.WindowManagement'
is not marked as serializable.
EnvDTE 程序集是 COM 互操作程序集。您可以通过创建一个来避免您的错误运行时可调用包装器,它根据互操作程序集中的信息编组对 COM 对象的调用。微软已经提供了一个扩展方法Microsoft.VisualStudio.TextTemplating
命名空间:
<#@ template hostspecific="true" language="C#" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#
IServiceProvider serviceProvider = (IServiceProvider)this.Host;
EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetCOMService(typeof(EnvDTE.DTE));
#>
T4 模板在单独的 AppDomain 中运行,我相信这就是您的代码尽管出现异常但仍能正常工作的原因。IServiceProvider.GetService(typeof(DTE))
返回透明的代理对象。此异常是因为代理要求跨应用程序域的对象用Serializable
属性。您可以确认代码中的 DTE 对象是“透明代理”,如下所示:
bool isProxy = RemotingServices.IsTransparentProxy(dte);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)