2015-11-25 19 views
0

我創建了一個帶有擴展方法的類庫,用於處理EnvDTE對象。一個例子擴展方法是:使用T4中單獨類庫中的擴展方法

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文件來創建我的擴展方法的集合,但是如果可以使其工作,我更喜歡一個類庫。

回答

0

所以,問題是用我的擴展方法的程序集嵌入Interop類型。我不得不把它們關掉我的擴展方法工作:

Embed Interop Types: False

Credits to Microsoft Support

+1

如果這解決了您的問題,請將此答案標記爲已接受,以幫助其他人快速找到正確的答案 –

0

我沒有測試過,但是根據這個blog post設置語言屬性爲「C#」或「VB」T4將使用2.0框架,但如果您使用「C#v3.5」或「VBv3.5」它將使用3.5框架,它應該允許你使用擴展方法。

+0

對不起,我不是在尋求幫助借力擴展方法。擴展方法實際上被執行,但運行時會因爲它試圖找到:我的自定義'EnvDTE.Extensions'程序集中的'EnvDTE._DTE'接口而感到困惑。該接口實際上位於'EnvDTE'組件內部。 –