2010-10-25 64 views
1

(我在C#中编码)管理结构的地址

我想通过API传递指向结构的指针。 说结构,

[StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)] 
     public struct PassThisStruct 
     { 
      public Int32 Param1; 
      public Int32 Param2; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst=13)] 
      public Char[] OutputData; 

     }; 

现在的API声明是: -

unsafe public delegate Int32 MyAPI(Int16 Something, PassThisStruct* StructPtr); 

即我想通过结构指针结构。

我为此API做了一个委托,然后从DLL中取回地址并将其存储在函数指针中。 但是,当我尝试编译时,它给我错误委托声明,“无法获取地址,获取大小或声明指向托管空间的指针”。

那么应该如何传递指针呢? 我知道我可以使用“ref”,但是这个API是用C++编写的,它需要一个结构指针。如果我使用ref,我不能传递Null,而且我也会因为“AccessViolationException”而出错(这对我来说是一个更大的问题!)。所以我会使用ref只有当我可以摆脱AccessViolationException。

还有一个问题,我可以在这种情况下通过空?如果是,如何?

问候!

+0

我的关于 “AccessViolationException” 问题:http://stackoverflow.com/questions/3958119/pinning-a - 结构 - 避免 - accessviolationexception – Swanand 2010-10-25 11:44:37

+0

我不明白为什么你应该得到这个错误。没有使用“托管”类型。也许这是'ByValArray'造成的问题。还要确保'struct'是'fixed'或一个局部变量。 – leppie 2010-10-25 12:19:05

+0

“委托申报”是什么意思?我没有看到你的代码中有这样的事情。 – leppie 2010-10-25 12:21:40

回答

1

我看到你正在启动常量字符数组。因此,我将改写这个结构为:

[StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)] 
    public unsafe struct PassThisStruct 
    { 
     public Int32 Param1; 
     public Int32 Param2; 
     public fixed char OutputData[3]; 
    }; 

1) 然后我会用IntPtr的PTR = Marshal.StructureToPtr(...);

unsafe public delegate Int32 MyAPI(Int16 Something, PassThisStruct* StructPtr) would change to: 
    public delegate Int32 MyAPI(Int16 Something, IntPtr StructPtr) 

2) 我还没有试过,但我认为,你可以这样做:

unsafe void MyMethod() 
    { 
    PassThisStruct s = new PassThisStruct(); 
    PassThisStruct* sPtr = (PassThisStruct*)s; 

    myAPI(12, sPtr); 
    }