我正在学习如何使用C#中的非托管代码,所以我试着用它制作了一些控制台应用程序.我有一个外部库,它有一个名为填充数组的函数,它返回一个字符指针.当我try 在FIXED语句中使用它时,GET错误"该表达式不能用于‘FIXED’STATEMEN".

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运行时不知道如何固定它.

在您的例子中,返回的指针可能位于array的中间.因为您信任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
}

Csharp相关问答推荐

有没有办法把+02:00转换成TimeSpan?""

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

如何在C#中删除一个特殊字符,如"使用Regex"

如何在Visual Studio代码中更改大括号模式{},用于C#语言

FileStream. FlushAsync()是否确保文件被写入磁盘?

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

使页面内容居中

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

CS1660无法将lambda表达式转换为类型INavigationBase,因为它不是委托类型

C#中浮点数的System.Text.Json序列化问题

具有可空类型的C#NOTNULL约束具有意外行为

在ASP.NET Core 8 MVC中本地化共享视图

如何避免在.NET中将日志(log)写入相对路径

如何使用Npgsql从SELECT获得所有查询结果

ReadOnlyMemory访问基础索引的替代方案

如何从非异步任务中正确返回TypeResult

用于分钟和秒验证的MudTextfield的正则表达式掩码

如何对列表<;列表>;使用集合表达式?

如何在C#中反序列化Java持续时间?