我有以下结构声明:
[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#代码中正确地进行成员声明?
答案 0 :(得分:1)
正如它所说:
指针和固定大小的缓冲区只能在不安全的环境中使用。
所以为了像这样使用固定大小的char缓冲区,你需要在你的结构中添加unsafe
:
public unsafe struct MyDLLInput
{
...
public fixed char PathtoData[256];
};
您还需要允许不安全的编译:
根据MSDN - Unsafe Code and Pointers (C# Programming Guide)
在公共语言运行库(CLR)中,不安全代码称为无法验证的代码。 C#中的不安全代码不一定是危险的;这只是CLR无法验证其安全性的代码。因此,如果CLR位于完全受信任的程序集中,则它只会执行不安全的代码。如果您使用不安全的代码,则您有责任确保您的代码不会引入安全风险或指针错误。
有关安全和不安全代码的更多信息和比较,您也可以检查 MSDN上的Safe and Unsafe Code。