Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Visual Studio 2022부터 DTE.get_Properties 속성 접근 시 System.MissingMethodException 예외 발생

현재 이 문제는 Microsoft.VisualStudio.SDK 17.0.31902.203 버전으로 업그레이드 후 해결되었습니다.

2019 버전까지 잘 동작하던 아래의 코드가,

Property property = dte.DTE.get_Properties("TextEditor", "PlainText").Item("IndentStyle");

// 또는

Property property = dte.DTE.Properties["TextEditor", "PlainText"].Item("IndentStyle");

2022 버전에서 (예외 정도가 아니라) crash가 발생합니다.

Log Name:      Application
Source:        Application Error
Date:          ...
Event ID:      1000
Task Category: (100)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      ...
Description:
Faulting application name: devenv.exe, version: 17.0.31410.414, time stamp: 0x9a994a46
Faulting module name: KERNELBASE.dll, version: 10.0.19041.1023, time stamp: 0x924f9cdb
Exception code: 0xe0434352
Fault offset: 0x0000000000034b89
Faulting process id: 0x56fc
Faulting application start time: 0x01d764426e58bfe9
Faulting application path: C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\devenv.exe
Faulting module path: C:\WINDOWS\System32\KERNELBASE.dll
Report Id: b4986db0-b5ff-4082-b479-ab498b66b309
Faulting package full name: 
Faulting package-relative application ID: 

Log Name:      Application
Source:        .NET Runtime
Date:          ...
Event ID:      1026
Task Category: None
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      ...
Description:
Application: devenv.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.MissingMethodException
   at TestExtension.Utility+<SetTextAsync>d__11.MoveNext()
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.__Canon ByRef)
   at TestExtension.Utility.SetTextAsync(EnvDTE80.DTE2, Microsoft.VisualStudio.Shell.AsyncPackage, EnvDTE.TextSelection, System.String)
   at TestExtension.TestCommand+<Action_InsertAsync>d__9.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at TestExtension.TestCommand+<CallAsync>d__25.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at TestExtension.TestCommand+<MenuItemCallback>d__14.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)

MissingMethodException 예외가 힘든 것은, 해당 메서드가 위치한 라인을 알려주는 것이 아니라 그것을 포함한 메서드만을 알려주기 때문입니다. 그래서 어떤 메서드의 부재로 예외가 발생하는지 알 길이 없습니다. 이걸 알려면 디버거를 걸거나, print 식 디버깅을 해야 합니다.




그런데 문제를 알아도 이런 식으로 수정하면 안 됩니다.

void SetTextAsync()
{
    Property property = null;

    Version version = new Version(dte.Version);
    if (version.Major <= 16) // 2019 이하 버전에서만 코드 실행!
    {
        property = dte.DTE.Properties["TextEditor", "PlainText"].Item("IndentStyle");
    }
}

왜냐하면, if 문에 상관없이 (문제가 발생한 메서드인) SetTextAsync를 JIT 컴파일할 때 MissingMethodException 예외가 발생하기 때문입니다. 따라서, 해당 코드를 JIT 순간에 방해가 되지 않도록 별도의 메서드로 분리해내야 합니다.

void SetTextAsync()
{
    Property property = null;

    Version version = new Version(dte.Version);
    if (version.Major <= 16) // 2019 이하 버전에서만 코드 실행
    {
        property = GetIndentStyle(dte);
    }
}

private static Property GetIndentStyle(DTE2 dte)
{
    Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
    return dte.DTE.Properties["TextEditor", "PlainText"].Item("IndentStyle");
}




검색해 보면,

Missing EnvDTE Properties for Debugging -> Symbols
; https://developercommunity.visualstudio.com/t/missing-envdte-properties-for-debugging-symbols/193262

동일한 증상인데,

EnvDTE.DTE dte = ServiceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
dte.Properties["Debugging", "General"].Item("EnableJustMyCode").Value = true;

"Debugging" 부분은 별도로 IVsDebuggerSymbolSettings120A / IVsDebuggerSymbolSettingsManager120A 인터페이스로 기능을 대체한 듯합니다. 이 글에서 문제가 된 TextEditor도 대체 인터페이스가 있을 듯한데 글쎄요... 테스트해 봐야 알겠지만 아래의 정도가 후보군이 될 수 있겠군요.

LanguagePreferences.IndentStyle Property
; https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.package.languagepreferences.indentstyle




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/11/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  174  175  176  177  178  179  [180]  ...
NoWriterDateCnt.TitleFile(s)
484정성태3/17/200719486오류 유형: 31. SQL Compact Edition 설치 후 오류
483정성태3/17/200740899오류 유형: 30. x64 환경: .NET + COM 프로젝트 실행 시 오류 - 80040154 [2]
482정성태3/17/200730355Team Foundation Server: 17. 팀 프로젝트 접속 및 사용
481정성태3/17/200724296Team Foundation Server: 16. 팀 프로젝트 읽기 전용 사용자 등록
480정성태3/14/200722420.NET Framework: 86. GC(Garbage Collector)의 변화
479정성태3/14/200726413개발 환경 구성: 25. D820 - ReadyBoost 구동
478정성태3/14/200725747개발 환경 구성: 24. D820 고주파음 문제
477정성태3/14/200735033개발 환경 구성: 23. 비스타 x64 버전에서 서명되지 않은 드라이버 사용 [4]
476정성태3/9/200730421개발 환경 구성: 22. D820 노트북 - 설치 및 BitLocker 구성 [1]
475정성태3/6/200724852.NET Framework: 85. 공용 프로퍼티 자동 생성
474정성태3/5/200723030.NET Framework: 84. Lambda 표현식 응용 사례 [1]
473정성태3/4/200730147디버깅 기술: 14. TFS 오류 추적(TF53010, TF14105)
472정성태3/3/200729247디버깅 기술: 13. 예외 발생 시 Minidump 생성 - WinDBG [3]파일 다운로드1
471정성태3/1/200718437디버깅 기술: 12. Managed Method에 Break Point 걸기
469정성태2/28/200729996디버깅 기술: 11. (Managed) Main Method에 Break Point 걸기 [3]파일 다운로드1
470정성태3/1/200721366    답변글 디버깅 기술: 11.1. (Managed) Main Method에 Break Point 걸기 - 내용 보강
468정성태2/25/200731213COM 개체 관련: 20. 탭 브라우저의 윈도우 핸들 구하기 [3]
466정성태2/22/200722934Windows: 23. 롱혼 서버 코어 버전 [2]
465정성태2/21/200721923오류 유형: 29. TFS 관련 스케줄 작업 실패
464정성태2/25/200723085오류 유형: 28. TF10217, TF53010, TF14105 오류
463정성태2/21/200716112Team Foundation Server: 15. 포탈 사이트의 보고서 주소를 도메인 명으로 적용
462정성태2/13/200743378.NET Framework: 83. 라이브러리에 다국어 리소스 추가 방법 [4]파일 다운로드1
461정성태2/13/200721100오류 유형: 27. DLinq 예제 오류 : error: 26 - Error Locating Server/Instance Specified
460정성태2/13/200721327.NET Framework: 82. Orcas 1월 CTP에서 Linq 소스 컴파일 방법
459정성태2/17/200725337오류 유형: 26. "Automatic Updates" 서비스 CPU 100% 점유 현상 - 두 번째 이야기 [3]
458정성태2/12/200721805.NET Framework: 81. LINQ 개발 환경 설정 [1]
... 166  167  168  169  170  171  172  173  174  175  176  177  178  179  [180]  ...