ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

T4使用DTE打开生成的文件时,Visual Studio序列化错误

2019-10-26 13:08:20  阅读:401  来源: 互联网

标签:visual-studio-2015 t4 envdte c


我们有一个名为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.

解决方法:

EnvDTE程序集是COM互操作程序集.通过创建Runtime Callable Wrapper可以避免发生错误,该代码将根据互操作程序集中的信息来封送对COM对象的调用. Microsoft已在
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))返回透明的Proxy Object.此异常是因为代理要求跨应用程序域的对象使用Serializable属性修饰.您可以确认代码中的DTE对象是“透明代理”,如下所示:

bool isProxy = RemotingServices.IsTransparentProxy(dte); 

标签:visual-studio-2015,t4,envdte,c
来源: https://codeday.me/bug/20191026/1936668.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有