2010-09-22 57 views
1

我有一个问题围绕第三方C库创建C#P/invoke包装。特别是,库具有签名的方法P /调用C#结构与字符串C无效*

int command(SomeHandle *handle, int commandNum, void *data, int datasize);

这是一个通配符方法,根据commandNum做不同的事情。数据可以是指向任何东西的指针,如单个整数或char []或某种结构(我的问题)。

我已经宣布了包装如下:


[DllImport("LIBRARY.DLL", EntryPoint = "command")] 
public static extern int Command(IntPtr Handle, int CommandNum, [In, Out] IntPtr Data, int DataSize); 

现在,当我与操作码调用它来填充一个byte []它的工作原理:


//WORKS, Buffer contains "library 1.0" after the call 
const int BUFFER_SIZE = 128; 
byte[] Buffer = new byte[BUFFER_SIZE]; 
int BytesWritten = 0; 
GCHandle BufferHandle = GCHandle.Alloc(Buffer, GCHandleType.Pinned); 
try 
{ 
    BytesWritten = Command(MyHandle, GET_VERSION, BufferHandle.AddrOfPinnedObject(), BUFFER_SIZE); 
} 
finally 
{ 
    BufferHandle.Free(); 
} 

然而,当我尝试与一个简单的结构相同,无论我尝试什么,我都无法使它工作。该结构是这样的:


public struct FormatInfoType 
{ 
    public int Format; 
    public IntPtr Name; //const char* 
    public IntPtr Extension; //const char* 
} 

在这里,我应该填写“格式化”用一个int(比如1),然后调用“命令(......)”是指给我回名称和扩展字段

如果我传递此结构,代码将编译并正确运行,但结构中的值永远不会被修改。如果我将IntPtr更改为Strings或StringBuilders(并且我尝试了大量的MarshalAs属性),那么我无法将IntPtr获取到该结构,因为它变成了非blittable,并且GCHandle行会引发异常。

任何帮助,将不胜感激。

编辑:

我试过很多方法来调用与结构的命令(),但目前,它看起来像这样:


FormatInfoType f = new FormatInfoType(); 
f.Format = 1; 
f.Name = IntPtr.Zero; 
f.Extension = IntPtr.Zero; 

GCHandle fHandle = GCHandle.Alloc(f, GCHandleType.Pinned); 
try 
{ 
    Command(MyHandle, GET_FORMAT_INFO, fHandle.AddrOfPinnedObject(), Marshal.SizeOf(f)); 
} 
finally 
{ 
fHandle.Free(); 
} 
+0

你可以显示代码用于编组'FormatInfoType'到你的函数吗? – 2010-09-22 21:57:30

+0

您是否尝试过使用'[MarshalAs(UnmanagedType.LPStr)]'属性标记的字符串? – 2010-09-22 22:01:33

+0

@Richard:我刚刚更新了这个问题。 @Ben,是的,我已经尝试过了,但是结构变得非blittable,我不能得到一个IntPtr它传递给命令(..)调用。 – Mastermnd 2010-09-22 22:07:04

回答

3

可以重载的P/Invoke签名,尝试:

[DllImport("LIBRARY.DLL", EntryPoint = "command")] 
public static extern int Command(IntPtr Handle, int CommandNum, ref FormatInfoType Data, int DataSize); 
+0

谢谢!!!绝对正确。它工作完美无瑕。 – Mastermnd 2010-09-22 22:20:54

+0

不客气:) – 2010-09-23 01:32:49