我們有一個名爲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.
調用堆棧可能幫助。 – Will
是的,但不幸的是它來自開發虛擬機,根本沒有外部訪問(這就是爲什麼我不打算重新鍵入所有程序集信息,關鍵GUID等)。調用堆棧很大,但它看起來像某種PInvoke編組問題。顯然DTE是COM。我隱約懷疑這是一個線程問題。 – McGuireV10
像我這樣的氣味偶然被跨AppDomain邊界拉過來。調用堆棧可以識別源,並且您可以在堆棧中的代碼底部調查誰擁有對該類型實例的引用。 – Will