假如C++中有结构体A:typedef struct a { BOOL v1; LONG v2; } A;extern "C" __declspec( dllexport ) void HelloWorld( A a ); extern "C" __declspec( dllimport ) void HelloWorld( A a );那么C#则要与其对应:public struct A { public bool v1; public long v2; }[DllImport("{C++.dll编译后的地址}")] public static extern void HelloWorld(A a);
^o^ 仅供参考, C#中记得 using System.Runtime.InteropServices;
{
BOOL v1;
LONG v2;
} A;extern "C" __declspec( dllexport ) void HelloWorld( A a );
extern "C" __declspec( dllimport ) void HelloWorld( A a );那么C#则要与其对应:public struct A
{
public bool v1;
public long v2;
}[DllImport("{C++.dll编译后的地址}")]
public static extern void HelloWorld(A a);
中相应的该怎么做呢
extern "C" __declspec( dllimport ) [结构体] HelloWorld( A a );[DllImport("{C++.dll编译后的地址}")]
public static extern [结构体] HelloWorld(A a);
{
MYPERSON* person;
int age;
} MYPERSON2, *LP_MYPERSON2;int TestStructInStruct(MYPERSON2* pPerson2);[ StructLayout( LayoutKind.Sequential )] //注意要用structlayout定义.net结构具体尺寸,具体含义查msdn
public struct MyPerson2
{
public IntPtr person;
public int age;
}
[ DllImport( "..\\LIB\\PinvokeLib.dll" )]
public static extern int TestStructInStruct( ref MyPerson2 person2 );
中相应的该怎么做呢谈一下我的看法
对返回值是一个结构体指针,在C#中可以用IntPtr来接收返回值,本质上说指针也就是个地址的编号,接收这个返回值没有什么难的,
关键是如何读取指针所指向的结构中的数据,这个返回的指针是在非托管环境下的,可以用Marshal.PtrToStructure将数据从非托
管内存块封送到托管对象托管,也就是转成C#的结构体。至于null我想就是IntPtr.Zero了,判断一下就行了。