Ошибка CS7038 (не удалось выпустить модуль) только в разделе «Редактировать и продолжить».

Я отлаживаю приложение .NET 4.0 в Visual Studio 2015. Мое приложение создается и работает нормально, но когда я пытаюсь отредактировать и продолжить работу под отладчиком, независимо от того, какие изменения я делаю или где я их делаю в своем основном проекте , я получаю диалоговое окно, в котором говорится:

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

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

Console.WriteLine("foo");

Когда я смотрю на панель списка ошибок Visual Studio, я вижу только одну ошибку, CS7038, с описанием «Не удалось создать модуль '<my app name>'». Имя файла, номер строки или символ не указаны. В моем коде нет волнистых красных подчеркиваний. Если я остановлю работающее приложение, соберу его с изменениями и снова запущу, все будет строиться и работать нормально. Таким образом, кажется, есть некоторое несоответствие между тем, что компилятор времени сборки и компилятор редактирования и продолжения считают приемлемым.

Кто-нибудь знает способ получить больше информации о том, почему компиляция завершается сбоем в режиме редактирования и продолжения? Я читал кое-что о подключении и отладке процесса VBCSCompiler, поэтому я попробовал это, но даже со всеми типами исключений, настроенными на прерывание при запуске, подключенный VS никогда не ломался.

Я не делюсь каким-либо кодом, потому что это вопрос не о моем коде, а скорее о стратегиях выяснения того, что компилятор Edit and Continue считает неправильным, и, насколько я знаю, источник ошибки компилятора может быть где угодно в моем весь проект.

Изменить:

Как уже упоминалось в комментариях, я смог подключить отладчик к Visual Studio и прервать работу, когда было выдано исключение при нажатии «Продолжить» после редактирования кода. Исключением был System.NotSupportedException со следующим сообщением: «Изменение версии ссылки на сборку не разрешено во время отладки». В нем было указано имя рассматриваемой сборки, которая представляла собой небольшой проект VB.Net, используемый моим приложением, которое в основном написано на C#. Я пытаюсь создать MCVE для отправки в Microsoft, но в настоящее время я не могу воспроизвести проблему в меньшем решении только с одним проектом VB и одним проектом C#.

Редактировать 2:

Я нашел обходной путь и сам ответил на вопрос на случай, если кто-нибудь еще столкнется с этой странной проблемой, но я оставляю галочку «Отвечено» для всех, кто может объяснить, что происходит (почему компилятор считает, что номер версии указанный проект был изменен во время редактирования).


person adv12    schedule 28.12.2016    source источник
comment
Вы убили все экземпляры VS и перезапустили? Вы сбрасывали настройки VS? Если нет, я бы начал оттуда.   -  person David    schedule 29.12.2016
comment
Я перезапустил VS, да. Не сбрасывал настройки VS, что звучит пугающе. Есть ли способ сохранить ваши настройки, чтобы вы могли восстановить их, если это не решит проблему?   -  person adv12    schedule 29.12.2016
comment
да. Перейдите в Инструменты -> Настройки импорта и экспорта. Оттуда вы можете сохранить текущие настройки (экспорт), перезагрузить старые настройки (импорт) или сбросить все. Если вы выберете «Сбросить все», на следующем экране будет задан вопрос, хотите ли вы сначала экспортировать текущие настройки (рекомендуется).   -  person David    schedule 29.12.2016
comment
Отлично. Спасибо. Я попытаюсь.   -  person adv12    schedule 29.12.2016
comment
Прикрепите отладчик к VS и ищите исключения.   -  person SLaks    schedule 29.12.2016
comment
@ Дэвид, сброс настроек VS, похоже, не имел значения.   -  person adv12    schedule 29.12.2016
comment
@SLaks, я запустил второй экземпляр VS 2015, подключенный к первому экземпляру, установил прерывание при возникновении для всех типов исключений, начал отладку моего проекта в первом экземпляре, приостановил выполнение, отредактировал файл и нажал «Продолжить». У меня появилось такое же диалоговое окно с ошибкой, как описано выше, но мой второй экземпляр VS никогда не ломался. Я делаю это неправильно?   -  person adv12    schedule 29.12.2016
comment
Нет; это звучит правильно, но очень удивительно; VS всегда генерирует исключения. Убедитесь, что параметр «Только мой код» отключен.   -  person SLaks    schedule 29.12.2016
comment
@SLaks, хорошо, я проверил Just My Code. Я снял галочку. Идет загрузка символов, а мне нужно домой, так что я заберу это завтра. Спасибо за вашу помощь.   -  person adv12    schedule 29.12.2016
comment
@SLaks, я задержался, пока символы не были загружены, и не нажал «Продолжить». Он выдал исключение, пойманное вторым экземпляром VS. Говорит, что изменение версии ссылки на сборку не разрешено во время отладки, и сообщает мне, какая сборка является проблемой (другой проект в решении). Это дает мне что-то, чтобы продолжить завтра. В очередной раз благодарим за помощь.   -  person adv12    schedule 29.12.2016
comment
Вы должны сообщить об ошибке на github.com/dotnet/roslyn/issues.   -  person SLaks    schedule 29.12.2016
comment
Спасибо, у меня смешанное решение c#/vb.net, и у меня была такая же проблема со звездочкой в ​​версии сборки vb. После того, как он будет равен тому же значению версии сборки С#, редактирование во время отладки будет в порядке, ошибка модуля не удалось выдать, исчезнет. Еще раз спасибо.   -  person v2h    schedule 20.03.2017


Ответы (2)


Я нашел обходной путь для проблемы, но я не совсем понимаю, что происходит. В проекте VB.NET, версия сборки которого, по словам компилятора Edit and Continue, менялась, был файл с именем «AssemblyInfo.vb». Этот файл содержал следующую строку:

<Assembly: AssemblyVersion("3.0.*")>

Версию сборки также можно установить в свойствах проекта с помощью кнопки «Информация о сборке» на вкладке «Приложение»:

скриншот свойств проекта Visual Studio для проекта VB.NET с установленным в двух местах AssemblyVersion

Когда я удалил строку AssemblyVersion из AssemblyInfo.vb, моя проблема с редактированием и продолжением исчезла. Сначала я подумал, что это произошло из-за того, что поля в окне информации о сборке были сохранены в другом файле из файла AssemblyInfo.vb, и между ними был некоторый конфликт, но теперь я вижу, что окно информации о сборке — это просто удобный способ редактирования информации о сборке. .vb: если я удалю строку в AssemblyInfo.vb, она будет очищена в окне информации о сборке.

После еще нескольких экспериментов оказалось, что виновником является звездочка в номере версии. Если я полностью укажу версию сборки, моя проблема с «Редактировать и продолжить» исчезнет. И упомянутый проект должен быть проектом VB.NET. Я попробовал ту же настройку с проектом C #, и я мог нормально редактировать и продолжать.

Похоже, это очень крайний случай, и я отправлю отчет об ошибке в Microsoft, но тем временем я хотел бы знать, что на самом деле происходит с компилятором — почему он получает две разные версии сборки одного сборка, которую действительно не нужно перекомпилировать во время отладки.... Если у вас есть хорошее объяснение того, что происходит, добавьте его в качестве ответа.

Изменить: вот отчет об ошибке, который я отправил.

person adv12    schedule 29.12.2016
comment
Судя по всему, ваш отчет об ошибке был удален... :-( - person Heinzi; 26.10.2017
comment
Кстати, звездочка указывает число, основанное на времени суток - см., например. это - person Wai Ha Lee; 14.02.2019
comment
Досадно, что это происходит для меня в смешанном проекте vb/c#, даже если проект с версией-* не изменился, но находится на другом языке. - person ToolmakerSteve; 14.06.2021

Это произошло со мной в приложении .net 4.8 с Visual Studio 2019.

У меня есть смешанные проекты vb и cs, здесь проблема возникает, когда vbproj ссылается на csproj, который использует оператор подстановки «*» для указания версии сборки.

Как прокомментировал выше @Wai-Ha-Hee, wildcast использует текущее время, я верю, что когда VS перестраивает приложение, чтобы применить внесенные вами изменения, версия сборки изменяется, вызывая ошибку.

В файле AssemblyInfo (проект присутствует с ошибкой) Изменить:

[assembly: AssemblyVersion("1.0.*")]

To:

[assembly: AssemblyVersion("1.0.0.0")]

Это решило для меня.

Важно отметить, что использование wildcast '*' делает сборку недетерминированной, это означает, что каждая сборка создает другую сборку. Это считалось плохой практикой, поскольку при сборке исходного кода в одних и тех же условиях создаются разные сборки.

В Visual Studio 2019:

Новый csproj/vbproj с файлом проектов в стиле, отличном от SDK, создается с помощью:

<Deterministic>true</Deterministic>

А в новом файле проектов в стиле csproj/vbproj с файлом проектов в стиле Sdk эта строка отсутствует, но по умолчанию также предполагается детерминированный.

Я рекомендую рассмотреть другие способы версии сборки.

Подробнее о детерминированном:
http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html
https://reproducible-builds.org/

person fsbflavio    schedule 20.01.2021