Публикация в один файл не работает с приложением WPF

У меня есть простое приложение WPF, которое я хочу опубликовать как один exe-файл. Вызываю команду:

dotnet publish -r win-x64 -c Release -p:PublishSingleFile=true

В итоге я получаю exe а также pdbфайлы. Когда я пытаюсь запуститьexe, курсор переходит в состояние "загрузка" на несколько секунд и... все. Приложение не запускается. Ошибки нет, просто не запускается. Когда я развертываю приложение без опции "один файл", оно работает нормально.

Я использую.NET Core 3.1.401

Что не так?

//РЕДАКТИРОВАТЬ

Журналы Dependency Walker (я опубликовал приложение на x86 и использовал x86 Dependency Walker):

Started "ADP.WPFUI.EXE" (process 0x40FC) at address 0x00860000 by thread 1.  Cannot hook module.
Loaded "NTDLL.DLL" at address 0x77C20000 by thread 1.  Cannot hook module.
Loaded "KERNEL32.DLL" at address 0x759C0000 by thread 1.  Cannot hook module.
Loaded "KERNELBASE.DLL" at address 0x75BC0000 by thread 1.  Cannot hook module.
DllMain(0x75BC0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNELBASE.DLL" called by thread 1.
DllMain(0x75BC0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNELBASE.DLL" returned 1 (0x1) by thread 1.
DllMain(0x759C0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" called by thread 1.
DllMain(0x759C0000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" returned 1 (0x1) by thread 1.
Injected "DEPENDS.DLL" at address 0x08370000 by thread 1.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" called by thread 1.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" returned 1 (0x1) by thread 1.
Second chance exception 0xC0000005 (Access Violation) occurred at address 0x707AE0E0 by thread 1.
Exited "ADP.WPFUI.EXE" (process 0x40FC) with code -1073741819 (0xC0000005) by thread 1.

2 ответа

Проблема в том, что pdb-файл не упакован в исполняемый файл.

Для меня включение этой строки (либо в файл сборки, либо в профиль публикации) заставило ее работать:

      <PropertyGroup>
    <IncludeSymbolsInSingleFile>true</IncludeSymbolsInSingleFile>
</PropertyGroup>

см. https://github.com/dotnet/sdk/issues/10523#issuecomment-535619277

Вы можете проверить источник ошибки в окне EventViewer. Ошибка при отсутствии pdb-файла выглядит так:

      Description: A .NET Core application failed.
Application: program.exe
Path: C:\path\to\program.exe
Message: Error:
  An assembly specified in the application dependencies manifest (program.deps.json) was not found:
    package: 'Microsoft.Data.SqlClient.SNI.runtime', version: '2.0.1'
    path: 'runtimes/win-x64/native/Microsoft.Data.SqlClient.SNI.pdb'

У меня была такая же проблема как для «.NET Core 3.1», так и «.NET Core 5.0».

Во-первых, попробуйте -c Release установить перед -r win-x64. Не знаю, почему это так, но у меня это сработало. Итак, для вашего примера кода это должно быть:

      dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true

То, что происходит в вашем коде программной части, также может быть причиной проблемы. Для меня это был обработчик событий, который обращался к кнопкам в строке заголовка.

Другие вопросы по тегам