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

비밀번호

댓글 작성자
 




... 151  152  153  154  [155]  156  157  158  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1177정성태11/18/201130010.NET Framework: 272. 소켓 연결 시간 제한 - 두 번째 이야기 [1]파일 다운로드1
1176정성태11/17/201129280.NET Framework: 271. C#에서 확인해 보는 관리 힙의 인스턴스 구조 [3]파일 다운로드1
1175정성태11/16/201127246.NET Framework: 270. .NET 참조 개체 인스턴스의 Object Header를 확인하는 방법 [1]파일 다운로드1
1174정성태11/15/201126642.NET Framework: 269. 일반 참조형의 기본 메모리 소비는 얼마나 될까요? [4]
1173정성태11/14/201122819.NET Framework: 268. .NET Array는 왜 12bytes의 기본 메모리를 점유할까? [1]
1172정성태11/13/201119835.NET Framework: 267. windbg - GC Heap에서 .NET 타입에 대한 배열을 찾는 방법
1171정성태11/12/201136511.NET Framework: 266. StringBuilder에서의 OutOfMemoryException 오류 원인 분석 [4]파일 다운로드1
1170정성태11/10/201125750.NET Framework: 265. Named 동기화 개체 생성 시 System.UnauthorizedAccessException 예외 발생하는 경우
1169정성태11/10/201129520.NET Framework: 264. 다중 LAN 카드 환경에서 Dns.GetHostAddresses(local)가 반환해 주는 IP의 우선순위는 어떻게 될까요? [4]
1168정성태11/6/201125366오류 유형: 139. TlbImp : error TI0000 : A single valid machine type compatible with the input type library must be specified
1167정성태11/5/201137150개발 환경 구성: 133. Registry 등록 과정 없이 COM 개체 사용 - 두 번째 이야기 [5]파일 다운로드4
1166정성태11/5/201123245.NET Framework: 263. byte[] pData = new byte[100000]로 인한 성능 차이? [1]파일 다운로드1
1165정성태11/3/201128120개발 환경 구성: 132. "Visual Studio Command Prompt (2010)" 명령행에서 2.0 버전의 MSBuild를 구동하는 방법 [2]파일 다운로드1
1164정성태11/1/201126332.NET Framework: 262. .NET 스레드 콜 스택 덤프 (4) - .NET 4.0을 지원하지 않는 MSE 응용 프로그램 원인 분석
1163정성태10/31/201125834.NET Framework: 261. .NET 스레드 콜 스택 덤프 (3) - MSE 소스 코드 개선파일 다운로드1
1162정성태10/30/201125923.NET Framework: 260. .NET 스레드 콜 스택 덤프 (2) - Managed Stack Explorer 소스 코드를 이용한 스택 덤프 구하는 방법파일 다운로드1
1161정성태10/29/201122780.NET Framework: 259. Type.GetMethod - System.Reflection.AmbiguousMatchException파일 다운로드1
1159정성태10/28/201126211.NET Framework: 258. Roslyn 맛보기 - SyntaxTree 조작 [2]
1158정성태10/24/201125526.NET Framework: 257. Roslyn 맛보기 - Roslyn Symbol / Binding API파일 다운로드1
1157정성태10/23/201129925.NET Framework: 256. Roslyn 맛보기 - Syntax Analysis (Roslyn Syntax API) [2]
1156정성태10/23/201128462.NET Framework: 255. Roslyn 맛보기 - Roslyn Services APIs를 이용한 Code Issue 및 Code Action 기능 소개 [1]
1155정성태10/22/201126493.NET Framework: 254. Roslyn 맛보기 - C# Interactive (2)
1154정성태10/22/201133234.NET Framework: 253. Roslyn 맛보기 - C# Interactive (1)
1153정성태10/21/201142108.NET Framework: 252. Roslyn 맛보기 - C# 소스 코드를 스크립트처럼 다루는 방법 [7]파일 다운로드1
1152정성태10/20/201123763.NET Framework: 251. string.GetHashCode는 hash 값을 cache 할까?
1151정성태10/18/201122692Java: 13. 자바도 64비트에서 (2GB) OutOfMemoryException 예외가 발생할까?
... 151  152  153  154  [155]  156  157  158  159  160  161  162  163  164  165  ...