Без символов при подключении к программе .NET Core (один файл)

Чтобы лучше объяснить, я дам некоторый контекст.

У меня есть приложение, которое динамически загружает библиотеку во время выполнения. Библиотека представляет собой своего рода плагин, и приложение предназначено для тестирования плагина.

Чтобы иметь возможность отлаживать плагин, я открываю VS Code с проектом плагина и подключаю отладчик к приложению, которое уже запущено и уже загрузило плагин. Сборка плагина собрана и содержит хороший PDB-файл.

Итак, рабочий процесс выглядит следующим образом: Application => load plugin => attach debugger

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

Однако есть сценарий, при котором я не могу прикрепить должным образом или символы не загружены. И это если я публикую приложение с флагом /p:PublishSingleFile=true. В этом сценарии создается один файл, и когда я пытаюсь подключить отладчик, он просто не работает.

Может ли кто-нибудь дать какое-либо представление об этом? Или возможное решение?

Стоит сказать, что я использую .NET 5

Ваше здоровье


person Goncalo Oliveira    schedule 18.11.2020    source источник
comment
Вы выполнили <DebugType>embed</DebugType>, как указано в .NET 5.0? Объявление?   -  person Damien_The_Unbeliever    schedule 18.11.2020
comment
Похоже, вам нужно использовать отладочную версию, но вы можете получить версию выпуска для создания файла pdb. См.: social.msdn.microsoft.com/Forums/en-US/   -  person jdweng    schedule 18.11.2020
comment
@Damien_The_Unbeliever разве бы не было, если бы мне нужно было отлаживать приложение? Мне нужно только отладить плагин, который загружается динамически и там есть PDB. Но попробовать стоит!   -  person Goncalo Oliveira    schedule 18.11.2020
comment
Вы пробовали скопировать mscordbi.dll из каталога win-x64 (или другого целевого) в каталог exe? github.com/dotnet/runtime/issues/42927   -  person DCCoder    schedule 18.11.2020
comment
@DCCoder, это хороший намек и, вероятно, сработал бы. Хотя это нарушает намерение иметь один файл. Так что я считаю это обходным путем, а не ответом. Спасибо за ссылку, это как раз корень проблемы.   -  person Goncalo Oliveira    schedule 18.11.2020


Ответы (1)


Отвечая на свой вопрос.

Начиная с .NET Core 3.0 использование флага /p:PublishSingleFile=true по умолчанию предполагает --self-contained true. И это имеет смысл, если вы упаковываете все в один файл, вам, вероятно, также понадобится среда выполнения .NET.

С --self-contained дело в том, что он обрезает сборки для уменьшения размера.

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

И при этом есть некоторые риски, которые могут привести к неправильному поведению среды выполнения, когда дело доходит до использования отражения (например, динамической загрузки сборок).

Однако существует риск того, что анализ времени сборки приложения может вызвать сбои во время выполнения из-за невозможности надежно проанализировать различные проблемные шаблоны кода (в основном сосредоточенные на использовании отражения).

Дополнительную информацию можно найти здесь.

Отключение --self-contained решает проблему, и я смог подключить отладчик к однофайловому приложению. Я сделал это, добавив <SelfContained>false</SelfContained> в файл проекта.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <SelfContained>false</SelfContained>
    <PublishSingleFile>true</PublishSingleFile>
  </PropertyGroup>
...

Надеюсь, это поможет кому-то в будущем.

person Goncalo Oliveira    schedule 18.11.2020