значение разрешения небезопасного кода в VS2013 [дубликат]

Простой ответ: везде, где находится ваш exe-файл, ALL DLL EmguCV и DLL OpenCV. Что происходит во время разработки, не имеет никакого отношения к развертыванию.

Мне удобно разместить DLL EmguCV в папке с моим EXE, а в папке с именем x64 помещены все DLL-файлы OpenCV. Папка x64 - это ALSo в той же папке, что и ваш exe.

Doug

30
задан 17 September 2008 в 18:12
поделиться

6 ответов

Это полезно для взаимодействия с неуправляемым кодом. Любые указатели, переданные неуправляемым функциям, должны быть исправлены (ака. Закреплены), чтобы сборщик мусора не перемещал базовую память.

Если вы используете P / Invoke, тогда маршаллер по умолчанию будет связывать объекты для вас , Иногда необходимо выполнить настраиваемую сортировку, и иногда необходимо связать объект дольше, чем длительность одного вызова P / Invoke.

29
ответ дан Brannon 27 August 2018 в 15:48
поделиться

поведение стиля reinterpret_cast

Если вы выполняете манипуляции с битами, это может быть невероятно полезно

, многие реализации высокопроизводительных хэш-кодов используют UInt32 для хеш-значения (это упрощает смену). Поскольку .Net требует Int32 для метода, который вы хотите быстро преобразовать uint в int. Поскольку не имеет значения фактическое значение, только то, что все биты в значении сохранены, требуется реинтерпрет.

public static unsafe int UInt32ToInt32Bits(uint x)
{
    return *((int*)(void*)&x);
}

отмечает, что именование моделируется на BitConverter.DoubleToInt64Bits

Продолжая в хешинговой вене, преобразование структуры на основе стека в байт * позволяет легко использовать хэш-функции байта:

// from the Jenkins one at a time hash function
private static unsafe void Hash(byte* data, int len, ref uint hash)
{
    for (int i = 0; i < len; i++)
    {
        hash += data[i];
        hash += (hash << 10);
        hash ^= (hash >> 6);
    }
}

public unsafe static void HashCombine(ref uint sofar, long data)
{
    byte* dataBytes = (byte*)(void*)&data;
    AddToHash(dataBytes, sizeof(long), ref sofar);
}

также небезопасно (от 2.0 и далее) позволяет использовать stackalloc. Это может быть очень полезно в ситуациях с высокой производительностью, когда необходим небольшой массив переменной длины, такой как временное пространство.

Все эти применения были бы крепко в «только если ваше приложение действительно нуждается в производительности» и, следовательно, неприменим для общего использования, но иногда вам это действительно нужно.

исправлено, если вы хотите взаимодействовать с некоторой полезной неуправляемой функцией (их много), которая принимает c-style массивы или строки. Таким образом, это не только по соображениям производительности, но и по правильности в сценариях взаимодействия.

8
ответ дан Abel 27 August 2018 в 15:48
поделиться
  • 1
    почему вы упомянули reinterpret_cast? Что такое параллель с небезопасным / исправленным? – Guillaume07 25 December 2012 в 01:01
  • 2
    @ Guillame07 Поскольку для непосредственного выполнения одного (в отличие от использования союзов в структурах) требуется небезопасный контекст – ShuggyCoUk 31 December 2012 в 11:33

Я считаю, что небезопасный код используется, если вы хотите получить доступ к чему-то вне среды выполнения .NET, т.е. это не управляемый код (без сбора мусора и т. д.). Сюда входят необработанные обращения к API Windows и всему этому джазу.

1
ответ дан Matt Wilkinson 27 August 2018 в 15:48
поделиться
  • 1
    & Quot; небезопасный & Quot; не означает «неуправляемый». Небезопасными методами на C # являются управляемые методы, которым разрешено манипулировать указателями. Однако код все еще управляется. Если вы хотите использовать неуправляемый (собственный) код в своем приложении, вы можете использовать C ++ / CLI и его директивы #pragma. – Christian Klauser 3 February 2009 в 00:42
  • 2
    рискованные мысли, сборщик мусора неактивен по небезопасным методам / переменным / объектам, его ОК, если вы работаете с существующими переменными, и вы связываете такие структуры данных, тем не менее, становится проблематичным, если вы расширяете область данных в небезопасной ситуации, если вы это делаете что-то неправильно, что он ест память, без контроля GBC. Можно хотя и иметь данные и использовать небезопасные методы для его обработки, если процесс не течет, нет риска и после обработки GBC может взять на себя ответственность. – user3800527 28 June 2018 в 10:29

Нам пришлось использовать фиксированное, когда адрес передается в устаревшую C DLL. Поскольку DLL поддерживала внутренний указатель на вызовы функций, все ад бы разрывался, если GC сжимал кучу и перемещал вещи вокруг.

4
ответ дан Nick 27 August 2018 в 15:48
поделиться

Это говорит о том, что разработчики .NET Framework хорошо справлялись с проблемным пространством - убедитесь, что среда «управляемого кода» может делать все, что может сделать традиционный (например, C ++) подход с его небезопасным кодом / указатели. Если это не возможно, небезопасные / фиксированные функции есть, если они вам понадобятся. Я уверен, что у кого-то есть пример, где нужен небезопасный код, но на практике он редко встречается - это скорее точка, не так ли? :)

1
ответ дан Patrick Szalapski 27 August 2018 в 15:48
поделиться
  • 1
    используемый в графических манипуляциях, используется быстрее, чем marshal.copy, используется в режиме реального времени обработки данных ea audio. но вы, вероятно, не увидите его на среднем сайте MVC, который часто встречается в комбинации с c / c ++ / ассемблером. – user3800527 28 June 2018 в 10:17

Я использовал небезопасные блоки для управления Bitmap-данными. Необработанный указатель-доступ значительно быстрее, чем SetPixel / GetPixel.

unsafe
{
    BitmapData bmData = bm.LockBits(...)
    byte *bits = (byte*)pixels.ToPointer();
    // Do stuff with bits
}

«фиксированный» и «небезопасный» обычно используется при выполнении взаимодействия или при необходимости дополнительной производительности. То есть. String.CopyTo () использует небезопасные и фиксированные в своей реализации.

21
ответ дан Rune 27 August 2018 в 15:48
поделиться
  • 1
    Я бы изменил "значительно" на «много порядков». Невероятно, насколько медленны SetPixel и GetPixel. Доступ к пикселям был быстрее в Apple IIe в 1980 году. – MusiGenesis 1 June 2009 в 03:13
Другие вопросы по тегам:

Похожие вопросы: