изменить:
эта записная книжка, кажется, работает для API Google Translate
, попробуйте эти шаги
Хорошо, это противно ... Опасности использования союза. Это может сработать, но не очень хорошая идея - я думаю, я бы сравнил это с рефлексией (где вы можете делать большинство вещей). Мне было бы интересно посмотреть, работает ли это в среде с ограниченным доступом - если так, это может представлять большую проблему ...
Я только что проверил это без флага "Полное доверие", и среда выполнения отклоняет его :
Не удалось загрузить тип «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
К сожалению, я запутал небезопасным
с исправленным
. Вот исправленная версия:
Причина того, что пример кода не требует пометки ключевым словом unsafe
, заключается в том, что он не содержит указателей (см. Цитату ниже, почему это считается как небезопасно). Вы совершенно правы: «безопасный» лучше назвать «дружественным во время выполнения». Для получения дополнительной информации по этой теме я отсылаю вас к Дону Боксу и Крису Селлсу Essential .NET
Цитируя MSDN,
В общеязыковой среде выполнения (CLR), небезопасный код упоминается как непроверяемый код. Небезопасный код в C # не обязательно опасно; это просто код, безопасность которого не может быть проверено CLR. CLR будет поэтому выполнять небезопасный код только в том случае, если это в полностью доверенной сборке. Если вы используете небезопасный код, это ваш ответственность за то, чтобы ваш код не представляет угрозы безопасности или ошибки указателя.
Различие между фиксированным и небезопасным состоит в том, что фиксированный не позволяет CLR перемещать объекты в памяти, так что объекты вне времени выполнения могут безопасно обращаться к ним, тогда как небезопасный - это как раз противоположная проблема: тогда как CLR может гарантировать правильное разрешение для ссылки dotnet, но не может сделать это для указателя. Вы можете вспомнить различные происходящие в Америке микроорганизмы о том, что ссылка не является указателем, и именно поэтому они так суетятся из-за тонкого различия.
Вы по-прежнему отказываетесь от бита «управляемый». Существует основополагающее предположение, что если вы можете сделать это, то знаете, что делаете.