DLL에서 관리되는 C# 메서드를 호출하는 관리되지 않는 C++ 함수가 있습니다. C# 메소드의 목적은 (C++ 호출자가 할당 한) 바이트 배열을 가져 와서 배열을 채우고 리턴하는 것입니다. 배열을 C# 메서드로 가져올 수 있지만 C++ 함수로 돌아 가면 채워진 데이터가 손실됩니다.C++ <--> 마샬링 된 바이트 배열을 수정하십시오.
C# DLL 방법 :
// bytes[] has been already allocated by its caller
short int SimGetBytesP2P(unsigned char bytes[])
{
unsigned short int numBytes = 0;
bytes[0] = 'x';
bytes[1] = 'y';
bytes[2] = 'z';
// bytes[] are {'x', 'y', 'z'} here
guiPtr->GetBytesFromBlaster(bytes, &numBytes);
// bytes[] SHOULD be {'a', 'b', 'c'} here, but they are still {'x', 'y', 'z'}
return(numBytes);
}
나는 그것을 믿지 : DLL을 호출
// Take an array of bytes and modify it
public ushort GetBytesFromBlaster([MarshalAs(UnmanagedType.LPArray)] byte[] dataBytes)
{
dataBytes[0] = (byte)'a';
dataBytes[1] = (byte)'b';
dataBytes[2] = (byte)'c';
return 3;
}
C++ 기능 지금,이 프로세스를 디버깅하는 내 테스트 코드는 C# 포인터를 새로운 관리 배열로 바꾸고 원래 배열을 수정하는 것과 관련이 있습니다. "ref"수정 자 등을 사용하여 여러 변형을 시도했지만 운이 없습니다. 또한이 데이터는 널로 끝나는 문자열이 아닙니다. 날 % Y이트는 널 (NULL) 종료가 아닌 원시 1 바이트 값입니다.
누구든지이 문제에 대해 알려주시겠습니까? 감사!
스튜어트
그건 속임수 였어! 고마워, 제임스! –