{Guid} .method $$ **** в файле кода. Не компилируется!
-
10-10-2019 - |
Вопрос
У нас есть сборка .NET из другого проекта, где в одном из сгенерированных файлов от отражателя есть фрагмент для метода.
Сейчас против 2010 C# Компилятор бросает все виды ошибок компиляции $$ неожиданно. Закрыть брекеты и т. д.
В ILDASM я вижу этот метод вместе со многими другими упомянутыми, но в сгенерированном коде я нахожу только 1 из этих методов компилятора.
Как скомпилировать?
Решение
Они обычно создаются static readonly
массивы. Вы не будете их компилировать. Также отражатель, в частности, является ошибочным воссозданием чего -либо, кроме тривиального кода.
Я предлагаю вам получить исходный исходный код.
Другие советы
Они автоматически генерируются компилятором, я считаю, что для таких вещей, как Lambda Expression Objects (для которых вы не предоставляете никакого имени). Я считаю, что они недействительными именами именно потому, что компилятор хочет убедиться, что нет никакого конфликта с вашим собственным кодом; Вам просто придется переименовать их, прежде чем повторно снять.
Во всех случаях я видел это, это связано с инициализаторами массива. Если вы посмотрите на типы, созданные в том, что вы заметите, что компилятор только что создал различную структуру для каждого инициализированного массива размеров. Компилятор делает это для уменьшения размера IL, распределения памяти скорости для элементов массива и сохранить элементы массива, хранящиеся в памяти вместе и по порядку. Не пробираясь глубоко в сорняках, я просто упомяну, что выполнение этого способа означает, что инициализация массива любого размера происходит в известном и постоянном количестве инструкций IL. Я не могу вспомнить из -за моего копания в Ильдезма, но я думаю, что это было 4. Назначение по одному означает 4 инструкции на элемент.
Теперь к вашей конкретной проблеме. Это не так уж и плохо, когда вы понимаете, что просто имеете дело с экземплярами типа стоимости, которые необходимо переименовать. Некоторый поиск в отражателе должен раскрыть случаи, когда используются объекты, сгенерированные компилятором. Первоначальное объявление и инициализация будут нетронуты в источнике. Это все, что вам нужно следовать, хотя с глобальным переименованием для этого объекта. Выберите любое имя, которое вы хотите, и замените сгенерированное имя компилятора. Я поместил какой -то другой код ниже, который иллюстрирует это. Для словарей, которые нуждаются в инициализации, он также оптимизирует и создает новый экземпляр для каждого словаря, называемого <> f_switch $ mapn, где n снова является счетчиком.
Вы также имеете дело с аналогичной ерундой для любых свойств, для которых были автогенерированы поля поддержки. То же самое, хотя. Создайте свое собственное поле поддержки и используйте его.
[CompilerGenerated]
internal class <PrivateImplementationDetails>
{
// Fields
internal static $ArrayType$4 $$field-0; // data size: 4 bytes
internal static $ArrayType$4 $$field-1; // data size: 4 bytes
internal static $ArrayType$4 $$field-2; // data size: 4 bytes
internal static $ArrayType$4 $$field-3; // data size: 4 bytes
internal static $ArrayType$44 $$field-4; // data size: 44 bytes
internal static $ArrayType$4 $$field-5; // data size: 4 bytes
// Nested Types
[StructLayout(LayoutKind.Explicit, Size=4, Pack=1)]
private struct $ArrayType$4
{
}
[StructLayout(LayoutKind.Explicit, Size=0x2c, Pack=1)]
private struct $ArrayType$44
{
}
}
static GATWavHelper()
{
riffBytes = new byte[] { 0x52, 0x49, 70, 70 };
waveBytes = new byte[] { 0x57, 0x41, 0x56, 0x45 };
fmtBytes = new byte[] { 0x66, 0x6d, 0x74, 0x20 };
dataBytes = new byte[] { 100, 0x61, 0x74, 0x61 };
headerSize = 0x2c;
floatToInt16RescaleFactor = 0x7fff;
__canonicalHeader = new byte[] {
0x52, 0x49, 70, 70, 0, 0, 0, 0, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20,
0, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 100, 0x61, 0x74, 0x61, 0, 0, 0, 0
};
}
// Fields
[CompilerGenerated]
private static Dictionary<string, int> <>f__switch$map0;
.
.
.
if (<>f__switch$map0 == null)
{
Dictionary<string, int> dictionary = new Dictionary<string, int>(3);
dictionary.Add("false", 0);
dictionary.Add("true", 1);
dictionary.Add("null", 2);
<>f__switch$map0 = dictionary;
}
if (<>f__switch$map0.TryGetValue(nextWord, out num))
{
switch (num)
.
.
.
В меню «Просмотр» выберите параметры.
Проверьте выбор оптимизации. Поскольку вы используете последнюю версию VS, вам следует указать оптимизацию для .NET 4.0 или не менее 3,5, чтобы получить поддержку Lambdas.