有一个c++写的dll,有个函数参数类型是一个结构体,我在c#中调用的时候,参数是一个属性类,我想问的是属性类和结构体可以通用吗?这样能调用成功吗?

解决方案 »

  1.   

    假如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);
      

  2.   

    ^o^ 仅供参考, C#中记得 using System.Runtime.InteropServices;
      

  3.   

    谢谢楼上各位热心的朋友,我还有一个疑问,就是如果c++写的dll中一个函数返回值是一个结构体指针,如果调用失败就返回null,那么c#
    中相应的该怎么做呢
      

  4.   

    不能更改结构体,主要问题在于c++写的dll中一个函数返回值是一个结构体指针,c#中怎么调用,谁是否可以给个调用实例
      

  5.   

    extern "C" __declspec( dllexport ) [结构体] HelloWorld( A a );
    extern "C" __declspec( dllimport ) [结构体] HelloWorld( A a );[DllImport("{C++.dll编译后的地址}")]
    public static extern [结构体] HelloWorld(A a);
      

  6.   

    exampletypedef struct _MYPERSON2
    {
       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 );
      

  7.   

    对如果c++写的dll中一个函数返回值是一个结构体指针,如果调用失败就返回null,那么c#
    中相应的该怎么做呢谈一下我的看法
    对返回值是一个结构体指针,在C#中可以用IntPtr来接收返回值,本质上说指针也就是个地址的编号,接收这个返回值没有什么难的,
    关键是如何读取指针所指向的结构中的数据,这个返回的指针是在非托管环境下的,可以用Marshal.PtrToStructure将数据从非托
    管内存块封送到托管对象托管,也就是转成C#的结构体。至于null我想就是IntPtr.Zero了,判断一下就行了。