不安全的结构不可访问的错误

时间:2014-01-13 08:42:07

标签: c# interop marshalling unsafe

结构定义

[StructLayout(LayoutKind.Sequential, Pack = Compile.PackSize)]
  unsafe struct DB_PREPLIST
  {
    public TxnUnion txn;
    public fixed byte gid[DbConst.DB_XIDDATASIZE];
  }

无法访问错误

enter image description here

问题

当我尝试将DB_PREPLIST更改为public时,我收到了另一个错误:

指针和固定大小的缓冲区只能在不安全的环境中使用

2 个答案:

答案 0 :(得分:1)

所有需要DB_PREPLIST作为参数的方法都需要在代码中保密。公开DB_PREPLIST在技术上可行,但风格很差,因为您需要标记所有呼叫站点不安全。使用另一个纯C#结构作为参数更好地包装所有调用,并使Delegate成为私有。在这种特殊情况下,这可能意味着您还必须通过包装器将调用重定向到委托。

答案 1 :(得分:0)

This replyTony The Lion回答了您的问题: 基本上,您需要将调用不安全结构的代码包装在“不安全”块中,即

unsafe 
{
   //your code
}

(编辑)你还需要将public访问修饰符添加到你的结构中,否则,不安全或不安全,你将无法访问它(除非它嵌套在调用它的类中)。