CSC: ошибка CS7038: не удалось исправить модуль
После установки Visual Studio 2015 и построения моего проекта я получаю сообщение об ошибке
"CSC: ошибка CS7038: не удалось исправить модуль".
Однако мое решение прекрасно работает в Visual Studio 2013.
Это проект веб-форм ASP.NET.NET 4.0
Кто-нибудь?
UPDATE: похоже, что проблема связана с Red Gate Smart Assembly в сочетании с параметрами метода со значениями по умолчанию.
ОБНОВЛЕНИЕ: Smart Assembly 6.9 исправляет ошибку для меня.
Ответы
Ответ 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
Это может произойти для любой ошибки, которую компилятор не уловил. Наверное
- либо компилятор не знает, какой IL выдавать, либо
- он знает, но в процессе этого происходит нечто неожиданное или
- IL, который он излучает, недопустим, и некоторая сеть безопасности на более низком уровне, чем сам компилятор, выдает ошибку, которую компилятор не собирается обрабатывать.
В любом случае, это CS7038
происходит, потому что С# является допустимым, и есть большая вероятность, что компилятор обнаружил ошибку в таком неожиданном месте, что он больше не сможет отследить ее до любой строки исходного кода, которую вы написали. Отсюда и кажущиеся случайными ошибки, о которых здесь сообщают люди.
Я использовал С# в течение десятилетий, и я прибыл сюда сейчас, потому что это первый раз, когда я получаю такую ошибку.
В моем случае следующий код генерирует ошибку. Используйте <LangVersion>Preview</LangVersion>
в файле проекта и используйте компилятор С# 8 в предварительном просмотре Visual Studio 2019.
void FailToEmitDll(ReadOnlySpan<char> span) {
ReadOnlySpan<char> temp;
temp = 1 switch
{
_ => span
};
}
Достаточно странно, если вы измените объявление и присваивание так, чтобы оно читалось как var temp
, все работает хорошо.