2011-03-23 3 views
3

.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)); 

답변

1

그것을 할 것입니다 :

C++

typedef struct 
{ 
    char szModel[32]; 
    float fSpeed; 
    float fData[20]; 
} CAR, far *LP_CAR; 

extern "C" { 
    int __stdcall Process(char *szModel, CAR &lpCar); 
} 

C#을

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
struct CAR 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
    public string szModel; 
    float fSpeed; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20)] 
    float[] fData; 
} 

[DllImport("Unmanaged.dll", CharSet = CharSet.Ansi)] 
static extern int Process(
    string model, 
    ref CAR data 
); 

다음과 같이 전화 :

CAR data; 
Process(@"test", ref data); 
1

이처럼 "CAR"ManagedClass 구조를 선언하십시오 :

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
struct CAR 
{ 
    [MarshalAs(UnmanagedType.AnsiBStr, SizeConst=32)] 
    public string szModel; 
    float fSpeed; 
    [MarshalAs(UnmanagedType.LPArray, SizeConst=20, MarshalTypeRef=typeof(float[]))] 
    float[] fData; 
} 

을 다음과 네이티브 메소드를 호출 :

여기에 코드입니다
CAR myCar; 

Process(model, ref myCar); 
+0

// 다음 컴파일을하지만, 그것은 단지 제로 빈 문자열을 제공합니다 : [구조적 레이아웃 (LayoutKind.Sequential, CharSet = CharSet.Ansi)] 공용 클래스 ManagedClass {[MarshalAs (UnmanagedType.ByValArray, SizeConst = 255)] public char [] szMo 델; public float fSpeed; public float [] fData = 새로운 float [20]; } – TexasCoder

+0

ManagedClass에서 "struct"대신 "class"를 사용하고 있습니다. 프레임 워크 마샬링 특성이 변환을 처리 할 때 char []을 string으로 변경해야합니다. 또한 프레임 워크에 의해 fData 배열이 마샬링되어야합니다. –

+0

클래스에 더 많은 배열이 있으므로 프레임 워크가 올바르게 정렬 할 수 없습니다. 구조체가 아닌 "클래스"를 사용해야합니다. – TexasCoder

관련 문제