如何在C#struct中声明和使用固定大小的char缓冲区

时间:2016-06-15 05:15:36

标签: c# c++ struct

我有以下结构声明:

[StructLayout(LayoutKind.Sequential)]
public struct MyDLLInput
{
    ...
    public fixed char PathtoData[256];
};

PathtoData按原样显示错误:

"Pointers and fixed-size buffers may only be used in an unsafe context."

MyDLLInput传递给C ++ DLL:

public class MyDLL
{
    [DllImport("MyDLL.dll",
        EntryPoint = "?Unit@@YA?AUOutput@@UInput@@@Z",
        CallingConvention = CallingConvention.Cdecl)]
    public static extern MyDLLOutput Unit(MyDLLInput UnitInput);
}

MyDLL.h将成员定义为:

char PathtoData[256];

如何在C#代码中正确地进行成员声明?

1 个答案:

答案 0 :(得分:1)

正如它所说:

  

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

所以为了像这样使用固定大小的char缓冲区,你需要在你的结构中添加unsafe

public unsafe struct MyDLLInput
{
   ...
   public fixed char PathtoData[256];
};

您还需要允许不安全的编译:

  1. 右键点击您的项目。
  2. 选择“属性”。
  3. 切换到“构建”标签。
  4. 选中“允许不安全代码”
  5. 根据MSDN - Unsafe Code and Pointers (C# Programming Guide)

      

    在公共语言运行库(CLR)中,不安全代码称为无法验证的代码。 C#中的不安全代码不一定是危险的;这只是CLR无法验证其安全性的代码。因此,如果CLR位于完全受信任的程序集中,则它只会执行不安全的代码。如果您使用不安全的代码,则您有责任确保您的代码不会引入安全风险或指针错误。

    有关安全和不安全代码的更多信息和比较,您也可以检查  MSDN上的Safe and Unsafe Code