2008-10-07 4 views
29

내장 된 웹 브라우저 컨트롤을 사용하는 프로그램이 있습니다.C# WebBrowser Control System.AccessViolationException

System.AccessViolationException 

FullText = System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
at System.Windows.Forms.Application.Run(Form mainForm) 

사람이 내가 이것을 얻을 것입니다 이유에 단서가 있습니까이의 사용 기간 동안 어떤 시점에서, 나는 어떤 시점에서 확실하지 않다,하지만 무작위로 나타납니다, 나는 다음과 같은 오류가 발생합니다 그리고 그것을 방지하는 방법?

+0

누구든지이 문제에 대한 일관된 해결책을 찾으면 알려 주시면 받아 들일 것입니다. 브라우저 컨트롤과는 달리 애플리케이션 외부에서 브라우저를 열어서 문제를 해결했습니다. –

+2

질문의 소유권을 다른 사람에게 넘기는 방법이 있습니까? 나는이 시스템에서 오랫동안 일하지 않으므로 여기서 대답을 결코 받아 들일 수 없습니다 ... –

답변

3

나의 직감은 내가 네비게이션하기 전에 문서를 조작하려고한다는 것입니다. 문서 텍스트 또는 html을 변경하기 전에 "about : blank"로 이동해보십시오.

탐색을 이미 수행중인 경우 탐색이 비동기이므로 탐색이 완료되었을 때를 감지하려면 브라우저의 이벤트를 모니터링해야합니다. 그렇지 않으면 문서에 쓰기 전에 시도 할 수 있습니다.

+1

문서에 쓰지 않습니다. 난 그냥 웹 브라우저에 URL을 전달 해요. 나는 또한 등 및 새로 고침 단추가 있습니다. 나는 언제든지 문서의 텍스트 나 HTML을 조작하지 않을 것이다. –

1

우리도이 문제에 시달리고 있습니다. 일관성없이이 예외가 발생합니다.

몇 가지 질문에 답해보십시오. 직접 mshtml 인터페이스 (예 : mshtml.dll)를 사용하고 있습니까? 모든 COM interop을 직접 수행합니까?

일부 COM MSHTML 인터페이스를 잘못 호출하면이 문제가 발생할 수 있습니다.

또한 COM 마샬링을 잘못하면이 문제가 발생할 수 있음을 발견했습니다.

MSHTML 인터페이스 가져 오기에 기본 제공 WebBrowser가 사용하는 버그가 있으면이 문제가 발생할 수 있습니다.

다른 도메인의 문서 IFRAME 요소에 액세스하면이 문제가 발생할 수 있습니다.

문서가 준비되지 않은 상태에서 WebBrowser를 호출하면이 문제가 발생할 수 있습니다.

0

그냥 제안이지만, 저는이 전문가가 아니지만 이전 응용 프로그램에서 WebBrowser를 많이 사용했습니다.하지만 브라우저에 아무 것도 전달하지 않고 항상 미리 읽기 확인을 시도하기 전에 1 초 기다리는 기능을 작성하지 않는 이유는 무엇입니까? 역시. 약간 느려지 겠지만 총알이 없어야합니다. :)

+0

나는 그것을 시험해보고 그것이 효과가 있는지 볼 것이다. –

0

탐색중인 페이지가 ActiveX 컨트롤을 호스팅하고 있습니까? 그렇다면 그 중 하나가 결함이있을 수 있습니다. 또한 IE에서 페이지를 확인하십시오. 그들이 같은 방식으로 충돌하는지보십시오. 그것은 콘텐츠 또는 브라우저 컨트롤에 특정한 것인지 분리하는 데 도움이됩니다.

0

브라우저에서 웹 페이지를 열었습니다. 그렇게해서 나는 이것에 대해 걱정할 필요조차 없습니다. 그래도이 오류가 발생하는 것은 이상한 일입니다.

+0

나는 원래 이것을 받아 들였지만 어떤 사람들은 이것을 답으로 사용할 수 없기 때문에 다른 사람들이 문제를 겪고있는 한이 질문에 답을 남기지 않을 것이다. –

0

이것은 비스타 문제 인 것 같습니다. 내 C# webBrowser1이 ActiveX 앱/스크립트를 실행하는 외부 IE 웹 페이지를 오버런하는 Java 애플릿을 실행하는 웹 페이지를 기다리고있었습니다.

ActiveX 스크립트가 C# 응용 프로그램의 메모리로 다시 업데이트하려고하면 Vista의 DEP "데이터 실행 방지"가이 작업을 적대적/바이러스로 지정하고 System.AccessViolationException으로 프로그램을 종료합니다. 쓰기 방지 된 메모리. 이것은 종종 다른 메모리가 손상되었다는 표시입니다."이에 대한 나의 수정 cmd를

"bcdedit.exe /set {current} nx AlwaysOff" 

이 라인 Vista에서 DEP의 설정하고 시스템을 재부팅하는 것이 었습니다

.

어떤 경우에는 내가 이런 일이 차가운 것 같아요, 그래서 XP도 DEP를 실행 여기 너무. DEP 문제가 이렇게의 경우 테스트합니다.

마우스 오른쪽 단추로 "내 컴퓨터" 선택 "등록 정보"와 시작 및 복구 "에서"고급 " 클릭, 설정을 클릭 이제 "편집"을 클릭하십시오 메모장이 막 시작되었습니다. 단순히 회선을 바꾸기 만하면됩니다. 코드 : AlwaysOff가 noexecute 옵션을 사용합니다. PC를 다시 시작하여 트랜잭션을 완료하십시오. 이 같은 반대를 수행하기에 충분 할 것을 DEP를 활성화하려면

:

은 견적에 의해 교체 : AlwaysOff로 NOEXECUTE = NOEXECUTE = 수신 선택 기능 (optin)

+0

이것은 XP 시스템에서도 발생했습니다. –

+0

XP도 DEP를 실행하므로 디버깅하는 동안 DEP가 켜져 있으면이 문제인지 확인하십시오. – Darkmage

+1

내 고객은 어떻습니까? 나는 DEP를 사용하지 못하도록 그들 모두에게 물어볼 수는 없다 ... –

5

우리는 최근의 시스템에 비슷한 문제가 있었다 여러 고객. 문제는 특정 환경에서 MSHTML 컨트롤의 버그로 판명되었습니다. 문제의 일반적인 증상은 jscript.dll 라이브러리의 등록이 깨진 것 같습니다.

동일한 문제인 경우 진단하는 데 도움이되는 증상 - jscript.dll이 디버거의 모듈에 표시되지 않고 프로세스에 의해로드되지 않습니다.

mshtml!CRootTracker::CollectGarbageInternal+0xd 
mshtml!CDoc::ReduceMemoryPressureTask+0x29 
mshtml!CStackPtrAry<unsigned long,12>::GetStackSize+0xb6 
mshtml!GlobalWndProc+0x183 
USER32!InternalCallWinProc+0x23 
USER32!UserCallWinProcCheckWow+0x109 
USER32!DispatchMessageWorker+0x3bc 
USER32!DispatchMessageW+0xf 

이 솔루션은 다시 등록 jscript.dll을 라이브러리에 있고 충돌이 멀리 가야한다 : 충돌에 대한 기본 스택 추적은 다음과 같다.

다음과 같이 라이브러리가 이루어집니다 재 등록 (64 비트 Windows 주어진 예를, 그렇지 않으면 첫 번째 라인이 필요하다) :

C:\Windows\System32\regsvr32.exe C:\Windows\System32\jscript.dll 
C:\Windows\SysWOW64\regsvr32.exe C:\Windows\SysWOW64\jscript.dll 

두 명령은 "관리자 권한으로 실행"해야합니다.

3

WebBrowser.ReadyState 및 WebBrowser.Document에 액세스하는 동안 여러 차례이 예외가 발생했습니다.

Windows XP 32 비트에서만 예외가 발생했습니다. 다른 솔루션이 도움이되지 않으면 스레드 문제로 보입니다. 뮤텍스 잠금을 사용하여 웹 브라우저 컨트롤에 액세스 한 모든 코드 블록을 둘러 봤으며 문제를 해결하는 것처럼 보였습니다.

+2

10 시간의 디버깅과 검색이 도움이되었다. 감사! 그건 그렇고, Windows 7에서는 예외가 발생했습니다. – Martynas