我有一些C代码,将使用P / Invoke从C#调用。我正在尝试为这个C函数定义一个C#等价物。
SomeData* DoSomething();
struct SomeData
{
...
}
如何将此C方法导入C#?我无法定义函数的返回类型。
修改 我有一堆函数要导入。这是让我卡住的一个。
[DllImport("SomeDll.dll")]
public static extern IntPtr DoSomething();
我想过使用IntPtr,即使它之后的正确方法是什么?
答案 0 :(得分:4)
我不太确定我理解你的问题,但我会尽力回答。您需要定义从C函数返回的结构,并使用Marshal.PtrToStructure来使用返回的结构。
[DllImport("SomeDll.dll")]
public static extern IntPtr DoSomething();
public struct SomeData
{
//...
}
//code to use returned structure
IntPtr result = DoSomething();
SomeData structResult = (SomeData)Marshal.PtrToStructure(result, typeof(SomeData));
答案 1 :(得分:3)
我猜你正在努力实现的目标如下:
问题是您无法将IntPtr解析为C#
中的结构...研究这个:
Marshal.PtrToStructure(IntPtr,Type)
http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx
您可以像这样包装代码
public static class UnsafeNativeMethods
{
[DllImport("SomeDll.dll")]
private static extern IntPtr DoSomething(); //NO DIRECT CALLS TO NATIVE METHODS!!
public static SomeData SafeDoSomething()
{
try
{
return (SomeData)Marshal.PtrToStructure(DoSomething(), typeof(SomeData));
}
catch(Exception ex)
{
//handle exception
}
}
}