2011-03-07 10 views
10

Im trabajando hacia un archivo DLL para el SDK de un software y estoy tratando de llamar a una función para obtener información acerca del anfitrión del software.P/Invoke, C#: unsigned char perder un byte

hay dos variables char sin signo (HostMachineAddress, HostProgramVersion) en la estructura que la función quiere y parece que "pierdo" el último byte cuando intento llamarlo desde C# ... si cambio SizeConst en el C# struct below to 5 obtengo el byte perdido, sin embargo, causa que la otra variable pierda datos.

es posible que alguien me ayude a encontrar una manera de resolver este problema? También tratar de utilizar una clase en lugar de struct causa de error system.stackoverflow

C# Struct

[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

¿Por qué HostProgramVersion y szHostProgramName intercambiados en su código C#? – Fox32

Respuesta

6

diseño Su C# de estructura es diferente de la de C++ uno (HostProgramVersion debe ser la última)

También para cadenas clasificadas como ByValTStr use [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)].

El problema con el último byte que falta puede ser que el contador de referencias intenta anexar nula a la cadena (como en la cadena terminada en cero). Intente utilizar sbyte[] + ByValArray en lugar de una cadena.

+1

+1 Además, siempre especificaría 'StructLayoutAttribute.Pack' aunque no sea relevante aquí. Un buen hábito para entrar. –

+0

siento mi error con respecto a las variables intercambiadas, sin embargo, eso no solucionó el problema, me temo, también agregó el Charset.Ansi. – Tistatos

+0

@Tistatos: mirando de nuevo su código, parece que está almacenando una dirección IPv4/prog.version de 4 dígitos. Eso significa que las matrices de 4 caracteres deberían realmente 'sbyte' arrays ?! –

Cuestiones relacionadas