2013-10-08 1 views
2

전에 보호 된 메모리 오류를 읽거나 쓰려고 시도했습니다. 일반적으로 C# 구조체를 올바르게 설정하지 않으면 오류가 나타납니다. 나는 다른 전화가 제대로 작동하지만이 하나는 협력하지 않습니다. 거의 모든 함수 호출과 문제의 원인이되는 struct 일 수 있습니다.PInvoke - 보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다.

C 구문

int CardTransaction(pTRequest req, char *ProductCodes) 

요청 구조

[DllImport("card.dll"), CallingConvention.Cdecl, CharSet = CharSet.Auto)] 
public static extern int CardTransaction(ref CardRequest cardRequest, [MarshalAs(UnManagedType.LPStr)] StringBuilder productCodes); 

ProductCodes 제가 너무 널

typedef struct _cardRequest 
{ 
    unsigned short RedemptionNum 
    long TotalAmount; 
    unsigned char filler1[257]; 
    char CardNumber[80]; 
    unsigned char cardType; 
} TRequest, *pTRequest; 

C# 함수 호출 (I 반복적 인 데이터 타입 있었다 C/B를 응축) 아무 것도없는 stringbuilder 객체를 인스턴스화하고 전달했습니다. 이것은 제가 생각할 수있는 한 곳입니다.

C# 구조

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]  
public struct CardRequest 
{ 
    public uint16 RedemptionNum 

    public int TotalAmount; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)] 
    public string filler1; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string CardNumber; 

    public byte cardType; 

} 
+0

'char filler1 [257]'의 요소는 항상 1 바이트 크기이므로 TStr이 아닙니다. – usr

+1

포장 값이 잘못되어 오류가 발생할 수 있지만 C 코드에 사용하는 컴파일러와 구조체 포장 옵션 또는 pragma가 사용 중인지 여부를 알려줘야합니다. – tinman

+0

C 코드에 대한 정보가 없습니다. 그것이 나에게 제공되는 모든 것입니다. 그리고 그것은 항상 문제였습니다. 그리고 C# 측 내가 그것을 작동하게하려고합니다. 충분한 정보가없는 저를위한 거대한 투쟁이었습니다. 그리고 마침내 막혔을 때 이것은 내가 여기에있는 경험이 제가하는 실수를 복습 할 것이라고 기대하는 것입니다. –

답변

2

명백한 문제는 C 코드를 정렬 구조체를 사용하지만, 어떤 이유로 당신은 C#을 구조체 팩을 선출 한 것입니다. 두 구조를 일치 시키려면 C# 코드에서 Pack = 1을 제거하십시오.

필러 배열은 문자열 이외의 바이트 배열처럼 보입니다. 나는 다음과 같이 선언 것 :

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 257)] 
public byte[] filler1; 

을 당신이 productCodes 매개 변수에 null를 전달하려는 경우, 당신은 단지 그렇게 할 수 기대합니다. 내가하는 일을 모두 기억할 수는 없지만 일반적으로 null을 p/invoke에 전달하면 marshaller가 NULL을 원시 코드로 전달합니다.

+0

안녕 David, 팩 1을 제거하면 오류 메시지가 사라집니다. 그러나 DLL에서 결과가 잘못된 것은 아닙니다. 그래서 바이트 []가 마음에 들지 않습니다. 하지만 ... 내게 가장 중요한 점은 오류 메시지를 제거하는 데 도움을 주었다는 것입니다. 구조체 및 함수에 대한 정보가 거의 없으므로 "명백한 문제는 C 코드가 정렬 된 구조체를 사용한다는 것입니다." 내가 배우고 길을 따라 걸려 넘어 졌을 때, 그것을 털어 놓은 것이 그것이 맞춰 졌던 것입니까? 또 다른 구조체가 필요했는데, pack = 1이 필요했습니다. 덕분에 다시 . –

+0

구조체가 기본적으로 정렬됩니다. –

관련 문제

 관련 문제