2

私は、Visual Studio SDK と Visual Studio 2010 Modeling and Visualization SDK をインストールしたソリューションを使用して、すべてのビルドで T4 テンプレートを実行する Visual Studio を取得するという投稿に従います。

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

エラー 2 実行中の変換: System.ArgumentNullException: 値を null にすることはできません。Parameter name: Could not obtain DTE from host at Microsoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.VsEntityFrameworkTemplateFileManager..ctor(Object textTemplating) at Microsoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.Create(Object textTransformation) at Microsoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D .GeneratedTextTransformation.TransformText() Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation (TemplateProcessingSession セッション、文字列ソース、ITextTemplatingEngineHost ホスト、文字列 & 結果) で。行 = 0、列 = 0 ApmWeb.Web.

私のスクリプトの最初の部分に続いて...

<#@ 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);

更新 この時点で問題が「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 のバグですか?

更新 DTE (EF.Utility.CS.ttinclude で PREPROCESSED_TEMPLATE を定義) を使用して VS との対話を削除すると、すべて機能しますが、たとえば、生成されたファイルをプロジェクトに追加する機能が失われます...それを機能させる他の方法はありますか?

4

1 に答える 1

0

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

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

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

于 2012-04-18T23:33:45.623 に答える