GenerateProxies.ttという名前のC#T4ファイルがあり、いくつかのコマンドラインcodegenユーティリティが呼び出されます。 System.Diagnostics Processクラスを使用して、標準出力をT4出力テキストファイル(GenerateProxies.txt)にリダイレクトして、エラーのコマンドライン出力を確認できるようにします。T4がDTEを使用して生成されたファイルを開くときにVisual Studioのシリアル化エラーが発生する
Visual Studioが生成されたテキストファイルをプロセスの最後のステップとして開くように、次の単純なコードをT4の最後に追加しました(workingDirectory
変数が宣言され、テンプレートの前に移入されています)。これは動作しますが、シリアル化エラーが発生します。このエラーを回避できますか?
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#
IServiceProvider vssp = (IServiceProvider)this.Host;
DTE dte = vssp.GetService(typeof(DTE)) as DTE;
dte.ItemOperations.OpenFile(
string.Format(@"{0}\GenerateProxies.txt", workingDirectory),
Constants.vsViewKindTextView
);
#>
ここでも、このは作業を行い、それがテキストファイルを開きますが、それはこのエラーを生成します。
Running transformation: System.Runtime.Serialization.SerializationException:
Type 'Microsoft.VisualStudio.Platform.WindowManagement.DTE.WindowBase' in
Assembly 'Microsoft.VisualStudio.Platform.WindowManagement'
is not marked as serializable.
。 – Will
ええ、残念ながら、外部からのアクセスが全くない開発用VMのものです(これは、すべてのアセンブリ情報、キーGUIDなどを再入力する必要はありません)。コールスタックは巨大ですが、何らかのPInvokeマーシャリング問題のように見えます。明らかにDTEはCOMです。私はスレッドの問題だと漠然と疑っています。 – McGuireV10
AppDomainの境界を越えて何かが誤って引かれているような気がします。コールスタックはソースを特定でき、そのタイプのインスタンスへの参照を持つ、スタック内のコードの最後に調査することができます。 – Will