저는 C# 응용 프로그램을 작성 중이며 효율성을 높이기 위해 C++에 있어야합니다. C++의 기능은 다음과 같이 내 보낸 :배열이 C# 가상 머신에 의해 쓰기 금지되어 있습니다.
extern "C" __declspec(dllexport) int fastSegment(char*, int, int);
나는 다음과 같이 C#에서이 기능을 가져옵니다
내가 처리 할 이미지는 다음과 같이이라고[DllImport(_dllname, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
static private extern bool fastSegment(byte[] img, int width, int height);
:
fastSegment(image, 640, 480);
image
은 올바른 크기입니다. 메모리를 낭비하고 새로운 배열을 할당하고 싶지 않기 때문에 배열을 C++ 함수에서 직접 수정했습니다.
어떻게됩니까? 죽음의 블루 스크린. 전에 Windows 7에서 본 적이 없었습니다.
내 기능은 테스트 목적으로 image[0]
, image[1]
및 image[2]
에만 기록했습니다.이 기능을 제거하면 모든 것이 정상입니다.
내 생각 엔 가상 머신이 메모리를 보호하지만 가상 머신이 단순히 예외를 throw하지 않는다는 것이 이상하다는 것을 알았습니다. 해당 버퍼의 보호를 해제 할 수있는 방법이 있습니까? 아니면 새 버퍼를 할당해야합니까?
편집 :
데이터를 쓸 때 프로그램이 실행됩니다. 이 갑작스런 충돌의 원인은 무엇일까요?
NT 모드에서 BSOD을 트리거 할 수없는 사용자 모드 코드가 있어야합니다. 어떻게 든 win32k.sys를 충돌 처리 할 수 있었는지 궁금합니다 ... windbg에서 커널 덤프 파일을 보면이 충돌에 대해 알려줄 것입니다. (자세한 내용은이 용어를 google을 참조하십시오.) – asveikau