Необработанное исключение в надежной службе Service Fabri c, когда для PublishSingleFile задано значение True - PullRequest
0 голосов
/ 06 августа 2020

Вот странный вопрос, который меня поставил в тупик. У меня есть приложение. NET Core, которое я развертываю в кластере Service Fabri c как надежную службу. Это отлично работало, пока я не добавил последние две строки в файл CSPROJ:

    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishSingleFile>true</PublishSingleFile>  <-- New
    <PublishTrimmed>true</PublishTrimmed>  <-- New

Это объединяет мою программу в один EXE. Однако, когда я его развертываю, SF сообщает мне, что приложение остановлено с кодом выхода 3762504530, что в основном означает некое необработанное исключение. Однако я могу go в узел и go в D: \ SvcFab_App \ и увидеть EXE и запустить его прямо из командной строки, и он запускается нормально.

Затем я немного покопался через журнал событий Windows, и я вижу эту ошибку:

Application: DeviceSync.exe
CoreCLR Version: 4.700.20.26901
.NET Core Version: 3.1.6
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException: Could not load file or assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
File name: 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
   at System.Reflection.RuntimeAssembly.GetType(QCallAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive, ObjectHandleOnStack assemblyLoadContext)
   at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
   at System.Reflection.Assembly.GetType(String name, Boolean throwOnError)
   at System.StartupHookProvider.CallStartupHook(StartupHookNameOrPath startupHook)
   at System.StartupHookProvider.ProcessStartupHooks()

Я отменил свои изменения в файле CSPROJ и снова опубликовал его, теперь он снова отлично работает.

Мой вопрос: когда я использую PublishSingleFile, почему я могу нормально запускать свою программу из командной строки, но служба Fabri c выдает исключение при запуске того же приложения на той же виртуальной машине?

1 Ответ

1 голос
/ 11 августа 2020

Удалите <PublishTrimmed>true</PublishTrimmed>. Это все еще экспериментально и может сократить некоторые допустимые зависимости от автономного пакета. Причина, по которой он работает, когда вы запускаете, войдя в узел, заключается в том, что он находится вне среды выполнения SF и, вероятно, может определить из global. Оставьте только <PublishSingleFile>true</PublishSingleFile>.

Если это все еще не работает, попробуйте добавить ссылку на пакет nuget для netstandard на вашем основном хосте .csproj <PackageReference Include="NETStandard.Library" Version="2.0.3" />

...