Вот странный вопрос, который меня поставил в тупик. У меня есть приложение. 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 выдает исключение при запуске того же приложения на той же виртуальной машине?