2

通常我對Visual Studio的速度沒有任何抱怨,但是如果我編寫一個寫出大約100行代碼的宏,則需要1-2分鐘才能完成。使用visual studio宏寫入當前文檔非常慢,建議加速?

這聽起來不對。有沒有更方便的方法來編寫代碼塊?

首先,我注意到它填充了撤消緩衝區,就好像我只是用手輸入文本一樣。我可以模仿複製/粘貼行爲,速度更快嗎?

這裏是一個人爲製造的例子,我想測試我的情況:

Sub WriteManyLines() 
    DTE.Commands.Raise("{AA61C329-D559-468F-8F0F-4F03896F704D}", 2, Customin, Customout) 
    DTE.Commands.Raise("{AA61C329-D559-468F-8F0F-4F03896F704D}", 5, Customin, Customout) 
    Dim sb As New StringBuilder() 

    For i As Integer = 1 To 100 
     sb.AppendFormat("public string Method{0:000}() {{ return ""Method{0:000}""; }}", i) 
     sb.AppendLine() 
    Next i 
    DTE.ActiveDocument.Selection.Text = sb.ToString() 
End Sub 

回答

4

這個API是極具欺騙性的,因爲它似乎你與StringBuilder的實際結果替換選定的文本。或者簡而言之,複製/粘貼。但是你真正在做的是輸入StringBuilder的結果(這就是你看到填充數據的撤消緩衝區的原因)。

這種類型的行爲對於來自DTE命名空間的大部分編輯體驗都是正確的。如果你對這些深奧的細節感興趣,我前一段時間寫了一篇關於這個普遍問題的博客體驗。

爲了解決這個問題,雖然你要放棄DTE和踏踏實實爲IVsTextLinesITextBuffer(後者是首選,因爲它是新的管理API)。爲了擺脫DTE的,你應該能夠執行上IVsTextLines以下

var vsTextLines = DTE.ActiveDocument.Object("TextDocument") as IVsTextLines; 

修改將直接進入緩衝區,避免打字的開銷。

如果您想完全避免DTE和COM,可以使用IVsEditorAdaptersFactoryService從COM層映射到新的2010託管API。此接口通常通過MEF查詢,但我相信您也可以使用IServiceProvider(其中DTE實現)併爲其調用QueryService

+0

你好Jared,很高興再次見到你,你跟着我嗎? )。感謝你的回答,似乎我有一些閱讀要做。我會爲初學者嘗試'IVsTextLines'。 – Abel 2012-01-12 18:53:00

+0

@Abel doh,如果我被抓住,沒有好的追隨者! :) – JaredPar 2012-01-12 18:53:48

2

我遇到了與Abel相同的問題,並且感謝JaredPar的提示,我可以通過這種方式修復它:代替使用IVsTextLines(它似乎只在安裝VS-SDK時可用)我只是使用TextDocument並從中獲得'EditPoint'對象。我的代碼如下所示:

Dim vsTextDoc As TextDocument = DTE.ActiveDocument.Object("TextDocument") 
Dim epoint As EditPoint = vsTextDoc.StartPoint.CreateEditPoint 
Dim strBuilder As StringBuilder = New StringBuilder 

'append everything to the strBuilder and then 
strBuilder.AppendLine("This is a line") 
epoint.Insert(strBuilder.ToString()) 

,現在感覺像照明快速比較無論是與DTE.ActiveDocument.Selection.Text事情之前發生!希望它能幫助未來的人:)

+0

感謝您的帖子,它肯定有幫助! – Abel 2012-03-28 18:23:04

+0

工程很好。沒有時間把我的宏轉換成這種方法。快得多。謝謝! – MTLPhil 2013-01-25 01:36:55

2
'' SLOOOW! 
' DTE.ActiveDocument.Selection.Text = str 
'' LIGHTNING FAST 
    Dim txtSel As TextSelection 
    txtSel = DTE.ActiveDocument.Selection 
    txtSel.Delete() 
    txtSel.Insert(str, vsInsertFlags.vsInsertFlagsInsertAtEnd)