DEP 비호환 ActiveX 오류
DEP가 간혹 문제가 되고 있습니다. 예전에도 DEP 활성화된 시스템에서 이에 호환되지 않는 ActiveX를 사용할 때 오류나는 경우를 한번 소개해 드렸지요.
Windowless ActiveX controls are not supported
; https://www.sysnet.pe.kr/2/0/582
근데, DEP 문제로 인한 ActiveX 활성화 오류가 꼭 위와 같지는 않더군요.
예를 들어, 제가 최근에 다뤘던 어떤 구형 ActiveX는 실행시에 다음과 같이 오류가 발생했습니다.
[그림 1: DEP 로 인한 ActiveX 활성 오류]
이번에도 역시 "((System.ComponentModel.ISupportInitialize)(this.axXObject1)).EndInit();" 에서 오류가 발생하긴 했는데, 이번엔 메시지가 다릅니다.
System.InvalidOperationException was unhandled
Message="Cross-thread operation not valid: Control 'axFBPlayer1' accessed from a thread other than the thread it was created on."
Source="System.Windows.Forms"
StackTrace:
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.SetParentHandle(IntPtr value)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.AxHost.EndInit()
at WindowsFormsApplication1.Form1.InitializeComponent()
at WindowsFormsApplication1.Form1..ctor()
at WindowsFormsApplication1.Program.Main()
InnerException:
어쨌든, 이런 경우에 봐야 할 것은 DEP 해결인데, NXCOMPAT 옵션을 명시적으로 해제하는 방법이 C# 프로젝트 설정창에는 제공되지 않기 때문에 별도의 빌드 이벤트를 구성하는 것으로 우회해서 처리할 수 있습니다. (DEP는 EXE 프로세스 수준에서 적용되는 것이기 때문에 ActiveX 오류일지라도 EXE 에서 NXCOMPAT를 수정해 주면 됩니다.)
우회 방법은 아래의 글에서 잘 설명해 주고 있습니다.
NXCOMPAT and the C# compiler
; https://learn.microsoft.com/en-us/archive/blogs/ed_maurer/nxcompat-and-the-c-compiler
그래서, 다음과 같은 빌드 이벤트 구성이면 된다는!
call "$(DevEnvDir)..\tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]