{Guid} .method $$ **** в файле кода. Не компилируется!

StackOverflow https://stackoverflow.com/questions/4447582

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top