2016-12-06 1 views
2

Wir haben eine C# T4-Datei namens GenerateProxies.tt, die mehrere Command-Line-Codegen-Dienstprogramme aufruft. Mit der System.Diagnostics-Prozessklasse leiten wir die Standardausgabe an die T4-Ausgabetextdatei (GenerateProxies.txt) um, sodass wir die Befehlszeilenausgabe auf Fehler überprüfen können.Visual Studio-Serialisierungsfehler, wenn T4 DTE verwendet, um generierte Datei zu öffnen

Ich habe den folgenden einfachen Code am Ende des T4 hinzugefügt, so dass Visual Studio die generierte Textdatei als letzten Schritt im Prozess öffnet (die workingDirectory Variable wird deklariert und früher in der Vorlage ausgefüllt). Das funktioniert, aber es wirft einen Serialisierungsfehler auf. Kann dieser Fehler vermieden werden?

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

Auch dies funktioniert, es die Textdatei öffnet, aber es erzeugt diesen Fehler:

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

Der Call-Stack könnte schreiben auszuführen helfen . – Will

+0

Ja, aber leider ist es von einer Entwicklungs-VM, die überhaupt keinen externen Zugriff hat (deshalb habe ich mir nicht die Mühe gemacht, alle Assembly-Informationen, die Schlüssel-GUID usw. erneut einzugeben). Der Aufruf-Stack ist riesig, aber es sieht aus wie eine Art von PInvoke-Marshalling-Problem. Anscheinend DTE ist COM. Ich vermute irgendwie, dass es ein Threading-Problem ist. – McGuireV10

+0

Es riecht nach etwas, das versehentlich über einen AppDomain-Rahmen gezogen wird. Der Aufrufstapel kann die Quelle identifizieren, und Sie können unten im Code im Stapel ermitteln, wer einen Verweis auf eine Instanz dieses Typs hat. – Will

Antwort

1

Dieser wird als keine Antwort jedoch konnte der OP nicht den Stack-Trace fordert in den Kommentaren.

Ich habe eine ähnliche Ausnahme ausgelöst wird, wenn ich versuche, eine Funktion in meiner tt-Datei in das Ausgabefenster (ST ist zu lang für einen Kommentar)

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

Verwandte Themen