c# - 为什么我不能在fixed语句中使用extern函数?

标签 c# function pointers dll unsafe-pointers

我正在学习如何在 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/

相关文章:

php - strip_shortcodes 不起作用

c++ - cpp 函数来检索各种数据类型的值

java函数匹配规则不同于C++

c - 为另一个结构中的结构数组分配内存

虚拟模式下的c#datagridview

C# Linq 查询在多个文本文件中搜索单个关键字

c++ - 为什么这个指针在其对象应该超出范围时有效? (以及其他一些奇怪的行为)

c++ - 可以传递匿名变量的地址吗?

c# - 有没有办法让我在系统命名空间中写的类优先于类

c# - 如何从 C# 中的列表列表中获取不同的元素