2016-12-06 35 views
2

我們有一個名爲GenerateProxies.tt的C#T4文件,它調用幾個命令行codegen實用程序。使用System.Diagnostics Process類,我們將標準輸出重定向到T4輸出文本文件(GenerateProxies.txt),以便我們可以查看命令行輸出的錯誤。當T4使用DTE打開生成的文件時,Visual Studio序列化錯誤

我將以下簡單代碼添加到T4的末尾,以便Visual Studio將打開生成的文本文件作爲該流程中的最後一步(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

是的,但不幸的是它來自開發虛擬機,根本沒有外部訪問(這就是爲什麼我不打算重新鍵入所有程序集信息,關鍵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

相關問題