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

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  142  143  144  145  146  147  148  [149]  150  ...
NoWriterDateCnt.TitleFile(s)
1329정성태8/21/201222896오류 유형: 161. Azure - Storage 삭제가 안되는 경우 [1]
1328정성태8/20/201233299개발 환경 구성: 163. IIS 7 - "MIME Types" 설정 아이콘이 없는 경우
1327정성태8/19/201238042Windows: 58. Windows 8 정식 버전을 설치해 보고... [14]
1326정성태8/19/201224352오류 유형: 160. Visual Studio 2010 Team Explorer 설치 오류
1325정성태8/15/201224358개발 환경 구성: 162. 닷넷 개발자가 컴파일해 본 리눅스
1324정성태8/15/201226393.NET Framework: 332. 함수형 언어의 코드가 그렇게 빠를까? [4]파일 다운로드1
1323정성태8/4/201228167.NET Framework: 331. C# - 클래스 안에 구조체를 포함하는 경우 발생하는 dynamic 키워드의 부작용 [2]
1322정성태8/3/201227828개발 환경 구성: 161. Ubuntu 리눅스의 Hyper-V 지원 (마우스, 네트워크)
1321정성태7/31/201227101개발 환경 구성: 160. Azure - Virtual Machine의 VHD 파일 다운로드 [2]
1320정성태7/30/201229081Math: 10. C# - (타)원 영역의 마우스 클릭 판단파일 다운로드1
1319정성태7/26/201227629개발 환경 구성: 159. Azure - 네트워크 포트 여는 방법 [1]
1317정성태7/24/201226468오류 유형: 159. SpeechRecognitionEngine.SetInputToDefaultAudioDevice 호출 시 System.InvalidOperationException 예외 발생
1316정성태7/18/201284602개발 환경 구성: 158. .NET 응용 프로그램에서 Oracle XE 11g 사용
1315정성태7/17/201229393개발 환경 구성: 157. Azure - Virtual Machine 구성 [2]
1314정성태7/16/201224407개발 환경 구성: 156. Azure - 2개 이상의 서비스 계정을 가지고 있을 때 프로젝트를 배포하는 방법
1313정성태7/16/201236586오류 유형: 158. Hyper-V 설치 후 VM 시작이 안되는 경우
1312정성태7/15/201236459Math: 9. 황금비율 증명
1311정성태7/15/201229161Math: 8. C# - 피보나치 수열의 사각형과 황금 나선(Golden spiral) 그리기파일 다운로드1
1310정성태7/13/201232607Math: 7. C# - 펜타그램(Pentagram) 그리기파일 다운로드1
1309정성태7/13/201230677개발 환경 구성: 155. 윈도우 운영체제에서 기본적으로 사용할 수 있는 압축 해제 방법
1308정성태7/3/201226050.NET Framework: 330. IEnumerator는 언제나 읽기 전용일까?파일 다운로드1
1307정성태6/30/201228297개발 환경 구성: 154. Sysnet, Azure를 만나다. [5]
1306정성태6/29/201228880제니퍼 .NET: 22. 눈으로 확인하는 connectionManagement의 maxconnection 설정값 [4]
1305정성태6/28/201227056오류 유형: 157. IIS 6 - WCF svc 호출 시 404 Not Found 발생
1304정성태6/27/201227855개발 환경 구성: 153. sysnet 첨부 파일을 Azure Storage에 마이그레이션 [3]파일 다운로드1
1303정성태6/26/201227387개발 환경 구성: 152. sysnet DB를 SQL Azure 데이터베이스로 마이그레이션
... 136  137  138  139  140  141  142  143  144  145  146  147  148  [149]  150  ...