Почему это кодирует работу без небезопасного ключевого слова?

изменить:

эта записная книжка, кажется, работает для API Google Translate

, попробуйте эти шаги

https://colab.research.google.com/ привод / 1hPH7skySCZR-ZMJ6TmYLN1ug6vbq2cpb # scrollTo = 2w4bHiuYXywg

19
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

Хорошо, это противно ... Опасности использования союза. Это может сработать, но не очень хорошая идея - я думаю, я бы сравнил это с рефлексией (где вы можете делать большинство вещей). Мне было бы интересно посмотреть, работает ли это в среде с ограниченным доступом - если так, это может представлять большую проблему ...


Я только что проверил это без флага "Полное доверие", и среда выполнения отклоняет его :

Не удалось загрузить тип «MemoryAccess» из сборки 'ConsoleApplication4, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null ', потому что объекты перекрываются со смещением 0 и сборка должна быть проверяемой.

И чтобы иметь этот флаг, вам уже нужно высокое доверие - так что вы уже можете делать более неприятные вещи. Строки - это немного другой случай, потому что они не являются обычными объектами .NET - но есть и другие примеры способов их изменения - хотя подход «объединение» интересен. Для другого хакерского способа (с достаточным доверием):

string orig = "abc   ", copy = orig;
typeof(string).GetMethod("AppendInPlace",
    BindingFlags.NonPublic | BindingFlags.Instance,
    null, new Type[] { typeof(string), typeof(int) }, null)
    .Invoke(orig, new object[] { "def", 3 });
Console.WriteLine(copy); // note we didn't touch "copy", so we have
                         // mutated the same reference
12
ответ дан 30 November 2019 в 05:01
поделиться

К сожалению, я запутал небезопасным с исправленным . Вот исправленная версия:

Причина того, что пример кода не требует пометки ключевым словом unsafe , заключается в том, что он не содержит указателей (см. Цитату ниже, почему это считается как небезопасно). Вы совершенно правы: «безопасный» лучше назвать «дружественным во время выполнения». Для получения дополнительной информации по этой теме я отсылаю вас к Дону Боксу и Крису Селлсу Essential .NET

Цитируя MSDN,

В общеязыковой среде выполнения (CLR), небезопасный код упоминается как непроверяемый код. Небезопасный код в C # не обязательно опасно; это просто код, безопасность которого не может быть проверено CLR. CLR будет поэтому выполнять небезопасный код только в том случае, если это в полностью доверенной сборке. Если вы используете небезопасный код, это ваш ответственность за то, чтобы ваш код не представляет угрозы безопасности или ошибки указателя.

Различие между фиксированным и небезопасным состоит в том, что фиксированный не позволяет CLR перемещать объекты в памяти, так что объекты вне времени выполнения могут безопасно обращаться к ним, тогда как небезопасный - это как раз противоположная проблема: тогда как CLR может гарантировать правильное разрешение для ссылки dotnet, но не может сделать это для указателя. Вы можете вспомнить различные происходящие в Америке микроорганизмы о том, что ссылка не является указателем, и именно поэтому они так суетятся из-за тонкого различия.

5
ответ дан 30 November 2019 в 05:01
поделиться

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

0
ответ дан 30 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

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