2016-12-06 3 views
2

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. 
+0

。 – Will

+0

ええ、残念ながら、外部からのアクセスが全くない開発用VMのものです(これは、すべてのアセンブリ情報、キーGUIDなどを再入力する必要はありません)。コールスタックは巨大ですが、何らかのPInvokeマーシャリング問題のように見えます。明らかにDTEはCOMです。私はスレッドの問題だと漠然と疑っています。 – McGuireV10

+0

AppDomainの境界を越えて何かが誤って引かれているような気がします。コールスタックはソースを特定でき、そのタイプのインスタンスへの参照を持つ、スタック内のコードの最後に調査することができます。 – Will

答えて

1

これは、要求されたとしてOPスタックトレースを提供することができなかったが答えではありませんコメントの中で。

コールスタックが役立つかもしれない私は、出力ウィンドウに書き込むために私のTTファイル内の関数を実行しようとしたとき、私は同様の例外がスローされている

(STコメントのために長すぎる)

private void WriteToOutput(string output) 
{ 
     if (_host == null) 
     throw new Exception("Host property returned unexpected value (null)"); 

     EnvDTE.DTE dte = (EnvDTE.DTE)_host.GetService(typeof(EnvDTE.DTE)); 

     if (dte == null) 
     throw new Exception("Unable to retrieve DTE"); 

     Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
     window.Activate(); 

     var outputWindow = (EnvDTE.OutputWindow) window.Object; 
     outputWindow.ActivePane.Activate(); 

     outputWindow.ActivePane.OutputString(output); 
     outputWindow.ActivePane.OutputString("\n"); 
    } 

Severity Code Description Project File Line Suppression State Error Running transformation: System.Runtime.Serialization.SerializationException: Type 'Microsoft.VisualStudio.Platform.WindowManagement.DTE.Windows' in Assembly 'Microsoft.VisualStudio.Platform.WindowManagement, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

Server stack trace: at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize) at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage..ctor(IMethodReturnMessage mrm) at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage.SmuggleIfPossible(IMessage msg) 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_Windows() at Microsoft.VisualStudio.TextTemplating8CBB5A87F4A34D52835396F51C533E1D8E9F22BC6977A9510B46C012D01E08C8AD263AC5BA030600D92BC0F39E7F1C3B6AA67D8CE545627E10A7F993E06C0D02.GeneratedTextTransformation.TypeMapper.WriteToOutput(String output) in C:\ViewModels\BaseGridViewModels\BaseViewModels.tt:line 581 at Microsoft.VisualStudio.TextTemplating8CBB5A87F4A34D52835396F51C533E1D8E9F22BC6977A9510B46C012D01E08C8AD263AC5BA030600D92BC0F39E7F1C3B6AA67D8CE545627E10A7F993E06C0D02.GeneratedTextTransformation.TypeMapper.GetItemsToGenerate[T](IEnumerable`1 itemCollection) in C:\ViewModels\BaseGridViewModels\BaseViewModels.tt:line 566 at Microsoft.VisualStudio.TextTemplating8CBB5A87F4A34D52835396F51C533E1D8E9F22BC6977A9510B46C012D01E08C8AD263AC5BA030600D92BC0F39E7F1C3B6AA67D8CE545627E10A7F993E06C0D02.GeneratedTextTransformation.TransformText() in C:\ViewModels\BaseGridViewModels\BaseViewModels.tt:line 33 C:\ViewModels\BaseGridViewModels\BaseViewModels.tt 581

関連する問題