2

일반적으로 Visual Studio의 속도에 대해 불만은 없지만 약 100 줄의 코드를 작성하는 매크로를 작성하면 완료하는 데 1-2 분이 걸립니다.Visual Studio 매크로를 사용하여 현재 문서를 작성하는 속도가 매우 느립니다.

맞지 않습니다. 코드 블록을 작성하는 또 다른 편리한 방법이 있습니까?

나는 한 손으로 텍스트를 입력하는 것처럼 실행 취소 버퍼를 채운다는 것을 알았습니다. 훨씬 빠른 복사/붙여 넣기 동작을 모방 할 수 있습니까? 당신이 StringBuilder의 실제 결과 선택한 텍스트를 교체하는 것으로 보인다에서 것을

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의 결과를 입력하는 것입니다 (이것이 데이터를 채우는 실행 취소 버퍼를 본 이유입니다).

이 유형의 동작은 DTE 네임 스페이스에서 오는 많은 편집 경험에 해당됩니다. 당신이 난해한 세부 사항에 관심이 있다면 나는이 일반적인 문제에 대한 블로그 경험을 몇 시간 전에 썼다. 당신이 DTE을 포기하고 IVsTextLines 또는 ITextBuffer에 내려 할 것이다하지만 그것을 해결하기 위해

http://blogs.msdn.com/b/jaredpar/archive/2010/06/10/avoiding-automation-bugs-when-implementing-iolecommandtarget.aspx

  • (는 새로운 관리 API의로 후자가 선호된다). DTE에서 얻으려면 버퍼로 직접 이동하고 입력의 오버 헤드를 피할 것 IVsTextLines에서 다음

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

    편집을 수행 할 수 있어야한다.

    DTE 및 COM을 완전히 제거하려면 IVsEditorAdaptersFactoryService을 사용하여 COM 계층에서 새로운 2010 관리되는 API로 매핑 할 수 있습니다. 이 인터페이스는 일반적으로 MEF를 통해 쿼리되지만, DFT가 구현하는 IServiceProvider을 사용하고 QueryService 호출을 사용할 수 있다고 생각합니다.

+0

안녕하세요, 다시 만나서 반갑습니다, 당신은 나를 따라오고 있습니까? ;). 대답 주셔서 감사합니다, 내가 할 일이 좀 읽을 것 같습니다. 우선'IVsTextLines'을 시도해 볼 것입니다. – Abel

+0

@Abel doh, 내가 잡히면 잘 따르지 않아! :) – JaredPar

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

+0

훌륭한 작품입니다. 내 매크로를이 방법으로 변환 할 시간이 없었다. 훨씬 더 빠릅니다. 감사! – MTLPhil

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