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

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  [8]  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13423정성태10/6/20233078스크립트: 58. 파이썬 - async/await 기본 사용법
13422정성태10/5/20233220닷넷: 2148. C# - async 유무에 따른 awaitable 메서드의 병렬 및 예외 처리
13421정성태10/4/20233247닷넷: 2147. C# - 비동기 메서드의 async 예약어 유무에 따른 차이
13420정성태9/26/20235349스크립트: 57. 파이썬 - UnboundLocalError: cannot access local variable '...' where it is not associated with a value
13419정성태9/25/20233107스크립트: 56. 파이썬 - RuntimeError: dictionary changed size during iteration
13418정성태9/25/20233786닷넷: 2146. C# - ConcurrentDictionary 자료 구조의 동기화 방식
13417정성태9/19/20233351닷넷: 2145. C# - 제네릭의 형식 매개변수에 속한 (매개변수를 가진) 생성자를 호출하는 방법
13416정성태9/19/20233161오류 유형: 877. redis-py - MISCONF Redis is configured to save RDB snapshots, ...
13415정성태9/18/20233642닷넷: 2144. C# 12 - 컬렉션 식(Collection Expressions)
13414정성태9/16/20233408디버깅 기술: 193. Windbg - ThreadStatic 필드 값을 조사하는 방법
13413정성태9/14/20233598닷넷: 2143. C# - 시스템 Time Zone 변경 시 이벤트 알림을 받는 방법
13412정성태9/14/20236873닷넷: 2142. C# 12 - 인라인 배열(Inline Arrays) [1]
13411정성태9/12/20233380Windows: 252. 권한 상승 전/후 따로 관리되는 공유 네트워크 드라이브 정보
13410정성태9/11/20234887닷넷: 2141. C# 12 - Interceptor (컴파일 시에 메서드 호출 재작성) [1]
13409정성태9/8/20233743닷넷: 2140. C# - Win32 API를 이용한 모니터 전원 끄기
13408정성태9/5/20233731Windows: 251. 임의로 만든 EXE 파일을 포함한 ZIP 파일의 압축을 해제할 때 Windows Defender에 의해 삭제되는 경우
13407정성태9/4/20233490닷넷: 2139. C# - ParallelEnumerable을 이용한 IEnumerable에 대한 병렬 처리
13406정성태9/4/20233443VS.NET IDE: 186. Visual Studio Community 버전의 라이선스
13405정성태9/3/20233869닷넷: 2138. C# - async 메서드 호출 원칙
13404정성태8/29/20233396오류 유형: 876. Windows - 키보드의 등호(=, Equals sign) 키가 눌리지 않는 경우
13403정성태8/21/20233224오류 유형: 875. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
13402정성태8/20/20233293닷넷: 2137. ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler
13401정성태8/19/20233530닷넷: 2136. .NET 5+ 환경에서 P/Invoke의 성능을 높이기 위한 SuppressGCTransition 특성 [1]
13400정성태8/10/20233369오류 유형: 874. 파이썬 - pymssql을 윈도우 환경에서 설치 불가
13399정성태8/9/20233391닷넷: 2135. C# - 지역 변수로 이해하는 메서드 매개변수의 값/참조 전달
13398정성태8/3/20234156스크립트: 55. 파이썬 - pyodbc를 이용한 SQL Server 연결 사용법
1  2  3  4  5  6  7  [8]  9  10  11  12  13  14  15  ...