我想了解如何正確地編組包含字節*的字段的C結構,以便可以將命令從C#應用程序發送到第三方API 。但是,我不斷收到抱怨參數的錯誤。這是我從C代碼:如何使用DLLImport爲C#編譯帶有字節*的字段的C結構
struct MY_STRUCT
{
int32 Object; // Object index, dependent of the context
int32 Cmd; // Command code
byte *Params; // pointer to parameters
};
int32 stdcall SendCommand(int32 DeviceId, MY_STRUCT *Cmd);
這是我當前如何引用到它在我的C#代碼:
public struct MY_STRUCT
{
public Int32 Object; // Object index, dependent of the context
public Int32 Cmd; // Command code
public IntPtr Params; // pointer to parameters
};
[DllImport("C:\\Client.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 SendCommand(Int32 DeviceId, ref MY_STRUCT Cmd);
Int32 CSharpSendCommand(int placa, int chan, int code, String parametros)
{
MY_STRUCT cmd = new MY_STRUCT();
cmd.Cmd = code;
cmd.Object = chan;
byte[] bytes = new byte[parametros.Length * sizeof(char)];
System.Buffer.BlockCopy(parametros.ToCharArray(), 0, bytes, 0, bytes.Length);
IntPtr p = Marshal.AllocHGlobal(bytes.Length);
try {
Marshal.Copy(bytes, 0, p, parametros.Length);
cmd.Params = p;
Int32 ret = Translated.SendCommand(placa, ref cmd);
if (ret != (int)LibraryStatus.Success)
Console.Out.Write("Erro: Comando 0x{0} retornou: {1}\n", code, ret);
return ret;
}
finally
{
Marshal.FreeHGlobal(p);
}
}
任何的猜測?在發送諸如Byte,Int32之類的原始類型時,它非常好用,等等......
此MSDN代碼可能會給你一個想法如何:http://msdn.microsoft.com/en-us/library/0szztey7.aspx – 2014-10-29 21:04:44
C代碼將理解字符串的可能性是你現在正在做的事情是關於zilch。使用Marshal.StringToHGlobalAnsi()。否則這只是瘋狂猜測沒有規範。 – 2014-10-29 21:22:17
你能分享錯誤信息或錯誤代碼嗎? – Sjips 2014-10-29 21:24:45