Тип локального объекта, объявленного в фиксированной инструкции, должен быть указателем - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь исправить приведенный ниже код, выдающий ошибку: Тип local, объявленный в фиксированном выражении, должен быть указателем.

любой может сказать мне, что не так здесь

       sbyte[] array = (sbyte[])(Array)Encoding.Default.GetBytes("MyAESCtr"); ;

        fixed (sbyte[] array4 = array)
        {
            sbyte* algo;
            if (array != null && array4.Length != 0)
            {
                algo = &array4[0];
            }
            else
            {
                algo = null;
            }
        }

вот функция, которой я отправляю значения:

 public unsafe int Encrypt(sbyte* Algo, sbyte* szd, sbyte* ped)
 internal unsafe static extern int EncryptC(sbyte*, sbyte*, _UString*, sbyte*);

1 Ответ

0 голосов
/ 31 марта 2020

При использовании fixed таким образом, новая переменная - это указатель , то есть

fixed (sbyte* array4 = array)

Однако! Я не думаю, что вам нужен unsafe код здесь, и вы, вероятно, не должны быть здесь. Просто ... используйте это как массив! Должна быть очень веская причина для использования fixed / unsafe, и я просто не вижу здесь никакой причины. Если вам просто нужно значение:

var algo = array[0];

Если вам действительно нужен указатель, предпочтите управляемый указатель:

ref sbyte algo = ref array[0];

edit; из комментариев кажется, что здесь происходит некоторое P / Invoke; что является допустимым сценарием для fixed, и в этом случае это должно работать нормально:

fixed (sbyte* ptr = array)
{
    sbyte* algo = null;
    if (array != null && array.Length != 0)
    {
        algo = ptr; // &ptr[0] **is** ptr
    }
    YourUnmanagedMethod(algo);
}

Важно: вы не должны использовать указатель, как только вы ' мы вышли из области fixed; указатель на ненадежен после этой точки из-за того, как работает G C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...