2012-04-05 8 views
2

この投稿には、Visual Studio SDKとVisual Studio 2010のモデリングとVisualization SDKインストールのソリューションを使用してGet Visual Studio to run a T4 Template on every buildがあります。「T4変換中にホストからDTEを取得できませんでした」

...しかし、私は解決できないエラーが発生します:

エラー2実行中の変換:System.ArgumentNullException:値をnullにすることはできません。 パラメータ名:マイクロソフトでMicrosoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.Create(オブジェクトtextTransformation) でMicrosoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.VsEntityFrameworkTemplateFileManager..ctor(オブジェクトtextTemplating) でホスト からDTEを取得できませんでした.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.TransformText()Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation(TemplateProcessingSessionセッション、Stringソース、ITextTemplatingEngineHostホスト、文字列&結果)。ライン= 0、列= 0 ApmWeb.Web.Client私のスクリプトの最初の部分に続いて

...

<#@ template language="C#" debug="false" hostspecific="true"#> 
<#@ include file="EF.Utility.CS.ttinclude"#> 
<#@ output extension=".cs"#><# 

CodeGenerationTools code = new CodeGenerationTools(this); 
MetadataLoader loader = new MetadataLoader(this); 
CodeRegion region = new CodeRegion(this, 1); 
MetadataTools ef = new MetadataTools(this); 

string inputFile = @"../../ApmWeb.Infrastructure.Data/Model/ApmWebModel.edmx"; 
MetadataWorkspace metadataWorkspace = null; 
bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace); 
EdmItemCollection ItemCollection =  
    (EdmItemCollection)metadataWorkspace.GetItemCollection(DataSpace.CSpace); 
string namespaceName = code.VsNamespaceSuggestion(); 

EntityFrameworkTemplateFileManager fileManager =  
    EntityFrameworkTemplateFileManager.Create(this); 

UPDATE は、私はこの問題は、「EF.Utilityにあることがわかりました.CS.ttinclude "...

dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); 
     if (dte == null) 
     { 
      throw new ArgumentNullException("Could not obtain DTE from host"); 
     } 

私の考えは、VSホスト外で変換を実行するとDTEオブジェクトを取得できないということです。このエラーは、たとえばチームビルド内で変換を実行しているときに発生します(MSBuildホストはDTEオブジェクトを認識しません)。実際にはVSから「カスタムツールを実行」を使用して動作しますが、前の記事で説明したようにオートマチックT4ビルドを設定すると機能しません。

どのように解決できますか? EF.Utility.CS.ttincludeのバグですか?

UPDATEすべての作品(EF.Utility.CS.ttincludeでPREPROCESSED_TEMPLATEを定義する)が、私は、例えば失うDTEを使用して、VSとの相互作用を削除 生成されたファイルを私のプロジェクトに追加する機能...それを動作させる別の方法はありますか?

+0

使用できるアプローチの1つは、生成されたコードを組み込むようにプロジェクトファイルを変更して、ワイルドカードを使用することです。 – GarethJ

+0

この問題は解決しましたか、回避策がありますか?私はそれに走っている.... – devlife

答えて

0

ビルド時に変換するときに、DTEにアクセスすることはできません。 プロジェクトに表示されない生成コードを処理する方法の1つは、ワイルドカードを使用してそのコードを含めることです。

は、限り、あなたは標準出力の命名規則を使用すると、これはあなたの合理的な経験を与える必要があります。ビルドターゲットを使用して、生成された出力を特定のフォルダにリダイレクトした後、より単純なワイルドカードを使用してフォルダ内のすべてを含めることもできます。

IDEで手動調整を行うと、このワイルドカードが削除され、評価の時点の結果に置き換えられることに注意する必要があります。

関連する問題