2011-03-07 5 views
10

임 소프트웨어의 SDK 용 dll 파일로 작업 중이며 소프트웨어 호스트 정보를 얻기 위해 함수를 호출하려고합니다.P/Invoke, C# : 부호없는 문자가 바이트를 잃는

함수가 원하는 구조체에 두 개의 서명되지 않은 char 변수 (HostMachineAddress, HostProgramVersion)가 있습니다. C#에서 호출하려고 할 때 마지막 바이트가 "느슨한 것처럼 보입니다 ... ... 내가 SizeConst를 C# 아래 5 struct 누락 된 바이트 가져옵니다, 그러나 다른 변수를 느슨하게 데이터를 발생합니다.

누군가이 문제를 해결할 방법을 찾도록 도와 줄 수 있습니까? 대신 구조체의 클래스를 사용하려고 시도하는 것은 system.stackoverflow 오류를 발생

C# 구조체

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct sHostInfo 
{ 
    public int bFoundHost; 
    public int LatestConfirmationTime; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
    public string szHostMachineName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string HostMachineAddress; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
    public string szHostProgramName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string HostProgramVersion; 
} 

C#

[DllImport("Cortex_SDK.dll")] 
public static extern int GetHostInfo(out sHostInfo pHostInfo); 
+2

HostProgramVersion과 szHostProgramName을 C# 코드로 바꿔 놓은 이유는 무엇입니까? – Fox32

답변

6

귀하의 C# 구조체의 레이아웃이 마지막이어야 C++ 일 (HostProgramVersion 다른).

ByValTStr으로 마샬링 된 문자열의 경우 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]을 사용하십시오.

마샬 러가 문자열에 널 (NULL) 종료 문자열과 같이 추가하려고하면 마지막 바이트가 누락 될 수 있습니다. 문자열 대신 sbyte[] + ByValArray을 사용해보십시오.

+1

+1 또한 여기서는 관련이 없어도 항상 'StructLayoutAttribute.Pack'을 지정했습니다. 들어갈 좋은 습관. –

+0

죄송 내 실수는 스왑 변수에 관한,하지만 내가 두려워 문제를 해결하지 않았다, 또한 Charset.Ansi를 추가했습니다. – Tistatos

+0

@Tistatos : 코드를 다시 보면 IPv4 주소/4 자리 prog.version을 저장하고있는 것 같습니다. 즉, 4-char 배열은 실제로'sbyte' 배열을 사용해야합니다! –

관련 문제