私は、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 との対話を削除すると、すべて機能しますが、たとえば、生成されたファイルをプロジェクトに追加する機能が失われます...それを機能させる他の方法はありますか?