【问题标题】:Using extension methods from a separate class library in T4在 T4 中使用来自单独类库的扩展方法
【发布时间】:2015-11-25 14:19:10
【问题描述】:

我创建了一个带有扩展方法的类库,用于处理EnvDTE 对象。一个示例扩展方法是:

namespace EnvDTE.Extensions
{
    public static class DTEExtensions
    {
        public static Project CurrentProject (this DTE dte)
        {
            return dte.ActiveDocument.ProjectItem.ContainingProject;
        }
    }
}

当我尝试在我的 T4 文件中使用扩展方法时:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="EnvDTE" #>
<#@ assembly name = "$(SolutionDir)..\..\Windows\EnvDTE.Extensions\EnvDTE.Extensions\bin\Debug\EnvDTE.Extensions.dll" #>
<#@ assembly name = "System.Core" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE.Extensions" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
<#
    var serviceProvider = (IServiceProvider)this.Host;
    var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
    var project = dte.CurrentProject();
#>
namespace <#= project.Properties.Item("DefaultNamespace").Value #>
{

}

我得到以下异常:

Severity    Code    Description Project File    Line
Error       Running transformation: System.Runtime.Remoting.RemotingException: Cannot load type 'EnvDTE._DTE, EnvDTE.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Server stack trace: 
   at System.Runtime.Remoting.Messaging.MethodCall.ResolveMethod(Boolean bThrowIfNotResolved)
   at System.Runtime.Remoting.Messaging.MethodCall..ctor(SmuggledMethodCallMessage smuggledMsg, ArrayList deserializedArgs)
   at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
   at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at EnvDTE._DTE.get_ActiveDocument()
   at EnvDTE.Extensions.DTEExtensions.CurrentProject(DTE dte) in D:\Users\Adaptive\Projects\Windows\EnvDTE.Extensions\EnvDTE.Extensions\DTEExtensions.cs:line 13
   at Microsoft.VisualStudio.TextTemplating0BE14095FFF8852C1DA8AAA0F831675849ECBB71E2A8B8BA2027BD64107CEDE73824E8CF863A0048B6B5FF80E64944B13E838B3338BD67CA7B6A2CF9BB4BD07C.GeneratedTextTransformation.TransformText() TicketTracker   D:\Users\Adaptive\Projects\Universal\TicketTracker\TicketTracker\Models\HoursModel.tt   1

知道我在这里做错了什么吗?看来转换引擎正在错误的库中寻找类型。我知道我可以通过导入各种 T4 文件来创建我的扩展方法的集合,但如果我可以让它工作,我更喜欢类库。

【问题讨论】:

    标签: visual-studio-2015 t4


    【解决方案1】:

    我没有测试过,但是根据blog post,当您将语言属性设置为“C#”或“VB”时,T4 将使用 2.0 框架,但如果您使用“C#v3.5”或“VBv3.5” " 它将使用 3.5 框架,应该允许您使用扩展方法。

    【讨论】:

    • 抱歉,我不是在寻求有关利用扩展方法的帮助。扩展方法实际上被执行了,但是运行时在尝试定位时会感到困惑:EnvDTE._DTE 在我的自定义 EnvDTE.Extensions 程序集中的接口。该接口实际上位于EnvDTE 程序集内。
    【解决方案2】:

    所以,问题在于我的扩展方法的程序集嵌入了互操作类型。我必须关闭它才能让我的扩展方法工作:

    Credits to Microsoft Support

    【讨论】:

    • 如果这解决了您的问题,请将此答案标记为已接受,以帮助其他人快速找到正确答案
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多