전에 보호 된 메모리 오류를 읽거나 쓰려고 시도했습니다. 일반적으로 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;
}
'char filler1 [257]'의 요소는 항상 1 바이트 크기이므로 TStr이 아닙니다. – usr
포장 값이 잘못되어 오류가 발생할 수 있지만 C 코드에 사용하는 컴파일러와 구조체 포장 옵션 또는 pragma가 사용 중인지 여부를 알려줘야합니다. – tinman
C 코드에 대한 정보가 없습니다. 그것이 나에게 제공되는 모든 것입니다. 그리고 그것은 항상 문제였습니다. 그리고 C# 측 내가 그것을 작동하게하려고합니다. 충분한 정보가없는 저를위한 거대한 투쟁이었습니다. 그리고 마침내 막혔을 때 이것은 내가 여기에있는 경험이 제가하는 실수를 복습 할 것이라고 기대하는 것입니다. –