.NET 응용 프로그램에서 사용해야하는 이전 C++ 함수가 있습니다. 포인터를 클래스로 다시 캐스팅하려고 시도 할 때마다 보호 된 메모리에 읽거나 쓰려고 시도했음을 나타내는 오류가 발생합니다. 누군가 나를 도와 옳은 방향으로 나를 안내해 줄 수 있습니까?비 기본 데이터 형식에 대해 .NET에서 이전 C++ 함수를 호출하십시오.
typedef struct
{
char szModel[32];
float fSpeed;
float fData[20];
} CAR, far *LP_CAR;
//Function prototype
int FAR PASCAL Process(char szModel[32], LP_DATA pCar);
그리고 내 .NET 코드 :
[DllImport("Unmanaged.dll", CharSet = CharSet.Ansi)]
public static extern int Process(string model, IntPtr data);
//****** Implementation **********
public class ManagedClass
{
public string szModel = new string(new char[32]);
public float fSpeed;
public float[] fData = new float[20];
}
ManagedClass aCar = new ManagedClass();
IntPtr ptr = Marshal.AllocHGlobal(Marshal.Sizeof(aCar));
Marshal.StructureToPtr(aCar, ptr, false);
Process(aCar, ptr);
ManagedClass model2 = (ManagedClass)Marshal.PtrToStructure(ptr,
typeof(ManagedClass));
// 다음 컴파일을하지만, 그것은 단지 제로 빈 문자열을 제공합니다 : [구조적 레이아웃 (LayoutKind.Sequential, CharSet = CharSet.Ansi)] 공용 클래스 ManagedClass {[MarshalAs (UnmanagedType.ByValArray, SizeConst = 255)] public char [] szMo 델; public float fSpeed; public float [] fData = 새로운 float [20]; } – TexasCoder
ManagedClass에서 "struct"대신 "class"를 사용하고 있습니다. 프레임 워크 마샬링 특성이 변환을 처리 할 때 char []을 string으로 변경해야합니다. 또한 프레임 워크에 의해 fData 배열이 마샬링되어야합니다. –
클래스에 더 많은 배열이 있으므로 프레임 워크가 올바르게 정렬 할 수 없습니다. 구조체가 아닌 "클래스"를 사용해야합니다. – TexasCoder