Подтвердить что ты не робот

CSC: ошибка CS7038: не удалось исправить модуль

После установки Visual Studio 2015 и построения моего проекта я получаю сообщение об ошибке

"CSC: ошибка CS7038: не удалось исправить модуль".

Однако мое решение прекрасно работает в Visual Studio 2013.

Это проект веб-форм ASP.NET.NET 4.0

Кто-нибудь?

UPDATE: похоже, что проблема связана с Red Gate Smart Assembly в сочетании с параметрами метода со значениями по умолчанию.

ОБНОВЛЕНИЕ: Smart Assembly 6.9 исправляет ошибку для меня.

4b9b3361

Ответ 1

Получена та же ошибка (новая установка проекта VS2015 Enterprise, ASP.NET webforms.NET 4.0).

После некоторого исследования я обнаружил, что в ссылках есть две библиотеки DLL. Оба являются сборками .Net 2.0, и оба они запутаны Red Gate Smart Assembly 6.5. И настоящая причина... obfuscation.

К счастью, эти сборки принадлежат мне, поэтому я попытался их построить, не используя Smart Assembly - ошибка исчезла.

Интересно, что никаких ошибок или предупреждений, представленных Visual Studio, перед попыткой создания проекта не было.

Удачи!

EDIT: обновление Smart Assembly до версии 6.9 устраняет проблему.

Ответ 2

Исходный фрагмент:

    private void radButton1_Click(object sender, EventArgs e)
    {
        string perp = radTextBox1.Text;

        int i = 0;
        DataRow arp = ale.Rows[i];
        while (i <= ale.Rows.Count)
        {
            if (ale.Rows[i].Field<>("FullName") = perp)
            {
                arp = ale.Rows[i];
                ale.Rows.Remove(arp);
            }

        }

        i = ale.Rows.Count;
        radLabel1.Text = i.ToString();
    }

Изменено:

    if (ale.Rows[i].Field<>("FullName") = perp)

К этому:

    if (ale.Rows[i].Field<String>("FullName") == perp)

Ответ 3

Поскольку @Andrey сообщила, что это, похоже, проблема с обфускацией сборок, что вызывает некоторые трудности для Roslyn. Сегодня мне удалось получить живое изображение этой ошибки, и основная причина, по-видимому, является обфускатором, является недействительным/искажающим, как значения параметров по умолчанию хранятся в метаданных. При запуске ildasm значения по умолчанию будут отображаться как:

.param [3] /* Invalid default value for 0800001F: */

Предыдущая версия компилятора обрабатывает этот сценарий, обрабатывая недопустимое значение как null или default(T). Мы будем устанавливать Roslyn, чтобы иметь такое же поведение.

Ответ 4

У меня также было исключение этого исключения в VB.NET(Visual Studio 2015 - Pro) и изолирована одна строка, которая вызывала ошибку.

В приведенной ниже строке кода, если вы определяете model как целое число, например:

Dim model as Integer = 2

а затем используйте:

Const N As Integer = model

вы выбросите исключение.

Однако, когда я изменил это значение на:

Dim N As Integer = model

исключение не было выбрано. Синтаксис Const был устаревшим кодом из другой программы, к которой я быстро добавлял модель, и константы не могут быть заданы для предопределенных целых типов.

Ответ 5

Расширение ответа от @jony-adamit:

У меня также была ошибка с этой компиляцией на С# (Visual Studio 2015). Это сводилось к различиям в выходе компилятора из .NET 4.5 и Roslyn - новом компиляторе в VS2015. Вы можете взять приведенный ниже код и запустить его самостоятельно или использовать dotnetfiddle (https://dotnetfiddle.net/fa2rMs) и переключиться между компиляторами.

В .NET 4.5 компиляторе (компилятор С# версии 12.0 или более ранней) вы получите это сообщение:

Ошибка компиляции (строка 16, столбец 7): имя типа или имени пространства имен 'Select' не существует в пространстве имен 'Tools.Weapons' (вы отсутствует ссылка на сборку?)

В версиях компилятора Roslyn 1.0.0 и 1.1.0 вы получите это сообщение:

Ошибка компиляции (строка 1, столбец 1): не удалось исправить модуль 'MyAssembly'.


Код для воспроизведения ошибки (обратите внимание на пространство имен):

public class Program
{   
    public static void Main()
    {
        Tools.Delegater.Work();
    }
}

namespace Tools 
{
    public static class Delegater
    {   
        public static System.Action Work = () => 
        {
            var query = from x in Weapons
                        select x;
        };
    }
}

namespace Tools.Weapons
{
    public class Cannon { }
}

Как вы можете сказать из сообщений компилятора, сообщение Roslyn оставляет вам гадание о том, что и где происходит ошибка компилятора. И в зависимости от размера приложения, отсутствие деталей может занять несколько дней или недель, чтобы обнаружить первопричину. В то время как сообщение в предыдущем компиляторе указывало вам точное место, чтобы начать просмотр вашего кода.

Еще одно большое различие заключается в том, что предыдущий компилятор покажет вам синтаксическую ошибку в Visual Studio для этого сценария, но, к сожалению, Roslyn (atm) этого не делает. Однако, если бы вы знали, где искать, и вы наводили указатель мыши на переменную "x" в выражении linq на sql, тогда вы увидите, что Rosyln не понимает, как ее интерпретировать.

Ответ 6

Я получал аналогичную ошибку: "BC36970. Не удалось исправить модуль" Something.dll "." Я понимаю, что код ошибки не является тем же, но он также является проблемой "с ошибкой", поэтому я решил поделиться своим ответом.

Проблема: Моя проблема заключалась в том, что у меня была строка, которая была константой, но я пытался добавить к ней еще одну строку (например, с помощью кода VB):

Dim MyString1 As String = "Test1"
Const MyString2 As String = "Test2" & MyString1

Решение: Мне просто пришлось преобразовать вторую строку из Const в Dim, и ошибка исчезла:

Dim MyString1 As String = "Test1"
Dim MyString2 As String = "Test2" & MyString1

Ответ 7

Я только что "Не удалось выдать модуль". Я по ошибке поставил пустые скобки при вызове универсального метода расширения, только когда он находится внутри тернарного оператора, например так:

var a = b == 6 ? 8 : x.Foo<>();

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

Ответ 8

Есть еще одна ошибка, которая может вызвать эту точную ошибку:

Случилось со мной после изменения имени свойства без рефакторинга, что вызвало некоторый код linq для вызова самого пространства имен!

Чтобы увидеть ошибку в действии, все, что вам нужно сделать, это запустить этот фрагмент кода:

public static int Test()
{
    var x = from c in ConsoleApplication5
        select 3;

    return x.First();
}

Где ConsoleApplication5 является пространством имен!
Это происходит только в VS2015.

Update:
Там issue для этого сейчас на GitHub, если кому-то интересно.

Ответ 9

Я получаю ту же ошибку "Ошибка при испускании модуля" с этим кодом, но изменение "Const" на "Dim" устраняет проблему:

Dim userStatus1 As String = convAttrSet("user_status")
Dim userStatus2 As String = convAttrSet("user_status")
Const PENDING As Boolean = (userStatus1 = userStatus2)

Ответ 10

Я получил эту ошибку, когда работал с таблицей данных и не предоставлял тип данных там, где это требовалось:

bool temp = dtTab.AsEnumerable().Any(row => row.Field<>("active") == 1);

Предоставление правильному типу данных избавиться от ошибки. Мне также пришлось преобразовать его в строку, чтобы иметь возможность сравнивать его правильно -

bool temp = dtTab.AsEnumerable().Any(row => row.Field<Boolean>("active").toString() == "1");

Ответ 11

Я тоже получил эту ошибку, похоже, есть некоторые основные причины, вызывающие эту ошибку.

Я отправил этот ответ, чтобы завершить упомянутые решения и помочь другим парням, чтобы они могли быстро решить эту ошибку.

Пожалуйста, внимательно прочитайте все ответы на этой странице, я уверен, что вы можете решить проблему, используя одно из упомянутых решений, удачи:)

Ответ 12

Этот ответ аналогичен тому, который был отправлен @wrtsvkrfm

  'Dim NEWLINE As String = "<BR/>"
   Dim NEWLINE As String = vbCrLf

 Const HT_QTC_VENDOR As String = "<B>some stuff {0}</B>" & NEWLINE

Это приведет к тому, что DLL не будет выпущена,

Измените верхние 2 строки на

  'Const NEWLINE As String = "<BR/>"
   Const NEWLINE As String = vbCrLf

и ошибка исчезнет. Это должна быть ошибка компиляции. CONST явно зависит от переменной, которая может..., ну..., меняться.: -)

Ответ 13

Я получил эту ошибку при использовании общего метода, но не смог включить этот тип.

Этот код дал ошибку:

example.GetValue<>(foo);

Коррекция просто заключалась в том, чтобы указать тип:

example.GetValue<string>(foo);

Я не уверен, что пример ошибки является допустимым синтаксисом или нет: я ожидал бы синтаксическую ошибку, если бы не эта ошибка, а Intellisense приняла синтаксис.

Ответ 14

Я получил эту ошибку при использовании linq для сущностей, и мой запрос linq имел синтаксическую ошибку в предложении соединения

Ответ 15

Для меня проблема возникла после добавления этапа postbuild, который изменяет assemblyinfo.cs(NetRevisionTool.exe). Позаботьтесь о том, чтобы не изменять AssemblyInfo.cs между зданием и редактировать и продолжать.

Ответ 16

Я также сделал это исключение в VB.NET(Visual Studio 2015 - Pro) и выделил одну строку, которая вызывала ошибку

     Faulty....
    Dim i As Short
    Dim j As Short = BancoCombienElement(LaChaine)
    Const a  = (22 / 60) * j
    Dim TiTxt As String = ""
    Dim S_8_10_12_14 As String = ""

    Work good!!!!!!!!
    Dim i As Short
    Dim j As Short = BancoCombienElement(LaChaine)
    Dim a As Short = (22 / 60) * j
    Dim TiTxt As String = ""
    Dim S_8_10_12_14 As String = ""

Ответ 17

Причина: эта ошибка появляется, когда в нашем коде есть что-то странное. Для меня я допустил ошибку при получении текущего пользователя от личности.

Код ошибки: int currentUserId = User.Identity.GetUserId <>();

Фиксированный код: укажите тип данных после GetUserID <------→(); в этом случае я указал int.

Примечание Пожалуйста, попробуйте отменить ваш код шаг за шагом, чтобы вы могли найти эту проблему. Но в противном случае мне было очень трудно отследить эту ошибку.

Спасибо

Ответ 18

Это может произойти для любой ошибки, которую компилятор не уловил. Наверное

  1. либо компилятор не знает, какой IL выдавать, либо
  2. он знает, но в процессе этого происходит нечто неожиданное или
  3. IL, который он излучает, недопустим, и некоторая сеть безопасности на более низком уровне, чем сам компилятор, выдает ошибку, которую компилятор не собирается обрабатывать.

В любом случае, это CS7038 происходит, потому что С# является допустимым, и есть большая вероятность, что компилятор обнаружил ошибку в таком неожиданном месте, что он больше не сможет отследить ее до любой строки исходного кода, которую вы написали. Отсюда и кажущиеся случайными ошибки, о которых здесь сообщают люди.

Я использовал С# в течение десятилетий, и я прибыл сюда сейчас, потому что это первый раз, когда я получаю такую ошибку.

В моем случае следующий код генерирует ошибку. Используйте <LangVersion>Preview</LangVersion> в файле проекта и используйте компилятор С# 8 в предварительном просмотре Visual Studio 2019.

void FailToEmitDll(ReadOnlySpan<char> span) {
  ReadOnlySpan<char> temp;
  temp = 1 switch
  {
    _ => span
  };
}

Достаточно странно, если вы измените объявление и присваивание так, чтобы оно читалось как var temp, все работает хорошо.