2011-10-05 6 views
10

관리되지 않는 C++ DLL을 사용하는 C# 응용 프로그램이 있습니다. WinXP (Win7이 아님)에서 C++ DLL에서 다시 전달하는 메모리가 너무 크면 충돌이 발생했습니다.C#에서 C++ DLL로부터 콜백을받을 때 WinXP의 메모리 제한은 무엇입니까?

기본 흐름은 C# DLL에서 콜백을 제공하는 start 함수를 호출하여 C#에서 작업을 시작한다는 것입니다. 그런 다음 C++ DLL은 작업을 수행하고 로깅 정보를 텍스트 버퍼에 덤프합니다. 작업이 완료되면 C++ DLL 콜백을 호출하고 매개 변수로 텍스트 버퍼 전달합니다

C++ :

typedef void (CALLBACK *onfilecallbackfunc_t)(LPCWSTR); 
DLL_API void NWAperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback); 

l_pFileCallback(_wstringCapture.c_str()); 

C 번호 :

public delegate void FileCallback([MarshalAs(UnmanagedType.LPWStr)] string buffer); 
public static extern void SetOnFileCallback(FileCallback fileCallback); 

private void OnFile(string buffer); 

이 Win7에에서 잘 작동을하지만,에 버퍼가 너무 커지면 WinXP가 충돌합니다. 나는 이것을 일으키는 정확한 크기에 대해 확신하지 못한다. 그러나 나는 그것에 8MB 한계를 두었고 충돌은 사라졌다.

WinXP에서 C++과 C# 사이에서 전송할 수있는 메모리 양에 대해 알고있는 사람이 있습니까? 아니면이 문제를 완전히 오해하고 더 논리적 인 설명이 있습니까?

업데이트 : 더 구체적이어야합니다. WinXP 및 Win7 이중 부팅, 둘 다 32 비트 OS를 사용하는 동일한 PC에서 발생합니다.

+0

+1 흥미로운 질문입니다. 나는 이것에 대한 답을 알고 싶다. – Polynomial

+0

Windows XP에서만 발생한다고 말합니까? 이것은 Win7 x64와 반대로 XP 박스 x86입니까? 64 비트 대 32 비트 아키텍처를 다루는 경우 문제의 원인이 될 수 있습니다. –

+0

스티브의 의견을 확장하면 AnyCPU 대신 x86을 대상으로 C# 코드를 컴파일하려고 했습니까? –

답변

2

결국 결국 나는 바보가되었다. 로그를 크게 만들었지 만 테스트 속도를 높이려면 취소 버튼을 클릭했습니다. C++ DLL에서 실행을 중단하고 '중단'오류 및 이미 기록 된 로그가있는 콜백 함수가 호출 된 함수를 호출했습니다. 그러나이 작업을 수행하면 즉시 실행이 중지되지 않으므로 로그 콜백이 진행 중일 때 C++ 코드가 로그에 추가를 시도 할 수 있습니다. 이것은 내가보고 있던 불안정성을 야기했다.

로그 주위의 중요 섹션을 사용하여 수정했습니다.

0

Windows 또는 NETFX에서 설정 한 하드 제한을 알지 못합니다. 그러나 C++ 응용 프로그램에서 반환 된 데이터 양이 완전히 임의적 일 수 있으며 이로 인해 변동이 발생할 수 있습니다.

로그 데이터를 기본 구성 요소의 파일에 기록한 다음 관리 코드에서 파일을 읽는 것이 좋습니다. 이렇게하면 얼마나 많은 데이터가 기록되는지에 상관없이 관리 코드가 힙을 날려 버릴 염려없이 분석 할 수 있습니다.

1

실제로 RAM이 부족하기 전에 연속 메모리가 부족할 수 있습니다. 이것은 배열 버퍼를 사용할 때 큰 단점입니다. 필요한 공간이 인접하지 않아도되므로 LinkedLists (또는 청크를 사용하는 배열)를 사용하면이 문제를 완화 할 수 있습니다.

응용 프로그램이 2GB 이상의 RAM을 사용하지 않으면 문제가 다른 것보다 메모리 조각화 가능성이 큽니다.

Windows 7은 Windows XP와는 다르게 RAM을 관리하고 있기 때문에 문제가 발생하지 않는 것일 수 있습니다. 그러나 더 많은 데이터를 밀어 넣으면 나는 당신이 거기에서 똑같은 문제를 겪게 될 것이라고 확신합니다.

응용 프로그램을 추적하기 위해 시스템 및 작업 관리자의 메모리 사용을 추적/기록하도록 perfmon을 설정할 수 있습니다.

관련 문제