我正在学习如何在 C# 中使用非托管代码,因此我尝试使用它制作一些控制台应用程序。我有一个外部库,其中有一个名为 fillArray 的函数,它返回一个 char 指针。当我尝试在固定语句中使用它时,出现错误“表达式不能在‘固定’语句中使用”。
char[] array = new char[42];
unsafe
{
char* a = FunctionsHolder.fillArray(array); // it works
fixed (char* p = FunctionsHolder.fillArray(array)) // here i have an error
{
//a bunch of code
}
}
最佳答案
fixed
语句固定一个托管对象,以便您可以拥有指向它的指针。
从 DLLImport 函数返回的指针不是托管对象(如果它来自您传入的指针,它可能是指向托管对象的指针),因此 .NET 运行时不知道如何固定它。
在您的情况下,返回的指针可能位于数组
的中间。由于您信任 p/invoke 来固定和取消固定它,因此当您获得返回值时,数组可能已经移动并且返回指针毫无意义。
您需要始终保持数组固定,以便有意义地使用指针。例如:
unsafe
{
char* p;
fixed (char* parray = &array[0]) // pins entire array
{
p = DllFunctions.findInArray(array, array.Length, sought);
// safely use `p`
}
// must not use `p` because the array object it points to is no longer pinned
}
关于c# - 为什么我不能在fixed语句中使用extern函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77447157/