paint-brush
วิธีการแก้ไขปัญหาข้อผิดพลาด 'hostpolicy.dll' และ 'singlefilehost.exe' ใน .NET 8.0.11โดย@markpelf
ประวัติศาสตร์ใหม่

วิธีการแก้ไขปัญหาข้อผิดพลาด 'hostpolicy.dll' และ 'singlefilehost.exe' ใน .NET 8.0.11

โดย Mark Pelf5m2025/01/03
Read on Terminal Reader

นานเกินไป; อ่าน

หลังจากอัปเกรดเป็น .NET 8.0.11 ฉันเริ่มพบข้อผิดพลาด และการสร้าง/แอปพลิเคชันล้มเหลว ฉันได้รับข้อความ "hostpolicy.dll...not found" และ "ข้อผิดพลาด MSB4018: … ไม่พบ ... singlefilehost.exe"
featured image - วิธีการแก้ไขปัญหาข้อผิดพลาด 'hostpolicy.dll' และ 'singlefilehost.exe' ใน .NET 8.0.11
Mark Pelf HackerNoon profile picture
0-item

การเปลี่ยนแปลงที่สำคัญในเครื่องมือสร้าง .NET จาก 8.0.0 ถึง 8.0.11

หลังจากอัปเกรดเป็น .NET 8.0.11 การสร้างโปรเจ็กต์บางส่วนของฉันก็ล้มเหลว…

1. คำอธิบายปัญหา

การตั้งค่าโครงการสร้างทำงานได้ดีในราวๆ .NET 8.0.0 ในภายหลัง เมื่ออัปเกรดรันไทม์ .NET เป็นเวอร์ชันใหม่กว่าของ .NET 8.0 และ .NET 9.0 และอัปเกรดเป็น Visual Studio โปรเจ็กต์บางโปรเจ็กต์ก็หยุดทำงาน ดูเหมือนว่าพวกเขาจะนำการเปลี่ยนแปลงที่หยุดทำงานมาใช้กับเครื่องมือสร้าง ตรรกะยังคงเหมือนเดิมและประเภทการสร้างก็เหมือนเดิม เพียงแต่เครื่องมือสร้างเริ่มทำงานแตกต่างออกไปเล็กน้อย จำเป็นต้องมีการกำหนดค่าการสร้างใหม่และสคริปต์การสร้าง


ฉันคิดว่าฉันสามารถระบุตำแหน่ง การเปลี่ยนแปลงพฤติกรรมที่ใดที่หนึ่งระหว่าง (.NET Framework 8.0.0/.NET SDK 8.0.100) และ (.NET Framework 8.0.11/.NET SDK 8.0.404) ไม่ใช่ทั้งหมด แต่บางโครงการที่สร้างล้มเหลว

1.1 สิ่งแวดล้อม

สภาพแวดล้อมทั่วไปที่บทความนี้ใช้คือ C#/VS2022

.NET เวอร์ชัน 8.0.11 หรือใหม่กว่า

และคุณกำลังสร้างโครงการประเภท SelfContained หรือ SingleFile

1.2 การแสดงออกถึงปัญหา

คุณได้รับ ข้อผิดพลาด/ข้อยกเว้น :

  • ไม่พบไลบรารี 'hostpolicy.dll' ที่จำเป็นสำหรับการเรียกใช้แอปพลิเคชัน

  • ข้อผิดพลาด MSB4018: …. ไม่พบไฟล์ …. singlefilehost.exe


 +++Error1,When running the application:++++++++++++++++++++ A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'C:\Program Files\dotnet\'. Failed to run as a self-contained app. - The application was run as a self-contained app because 'C:\tmpNetBundle\BundleExample02_NET90\ConsoleApp2C\ SelfContained_SingleFile_win-x64\ConsoleApp2C.runtimeconfig.json' was not found. - If this should be a framework-dependent app, add the 'C:\tmpNetBundle\BundleExample02_NET90\ConsoleApp2C\ SelfContained_SingleFile_win-x64\ConsoleApp2C.runtimeconfig.json' file and specify the appropriate framework. PS C:\tmpNetBundle\BundleExample02_NET90\ConsoleApp2C\ SelfContained_SingleFile_win-x64> +++Error2,During build++++++++++++++++++++ error MSB4018: The "GenerateBundle" task failed unexpectedly. [C:\tmpNetBundle\BundleExample01_NET_8.0.0_SDK_8.0.100\ConsoleApp2\ConsoleApp2.csproj] error MSB4018: System.IO.FileNotFoundException: Could not find file 'C:\tmpNetBundle\BundleExample01_NET_8.0.0_SDK_8.0.100\ConsoleApp2\ obj\Release\net8.0-windows\win-x64\singlefilehost.exe'.


1.3 สาเหตุของปัญหาและการแก้ไขปัญหา

ดูเหมือนว่าแฟล็ก <PublishSingleFile>true</PublishSingleFile> ในไฟล์โปรเจ็กต์ .csproj จะหยุดทำงานในบางกรณี ฉันจึงอาศัยแฟล็กนั้นในสคริปต์สร้างของฉันหลังจากนั้น ไม่มีปัญหา เราสามารถคาดการณ์สิ่งนั้นได้ เมื่อเรารู้ว่าจะคาดหวังอะไร


ดูเหมือนว่ากระบวนการสร้างจะเรียกใช้ “dotnet publish” จาก .NET SDK 9.* สำหรับโปรเจ็กต์ที่ฉันกำลังสร้างสำหรับเฟรมเวิร์ก .NET 8.* ดังนั้น ฉันจึงตัดสินใจใช้ไฟล์ global.json เพื่อระบุ SDK ที่ฉันต้องการใช้โดยชัดเจน

ตัวอย่างโค้ด 2 ตัว

เหล่านี้เป็นการตั้งค่ารุ่นเก่าที่ใช้งานได้กับ NET_8.0.0/SDK_8.0.100 แต่หยุดทำงานในเวอร์ชันใหม่กว่า

 // NET_8.0.0/SDK_8.0.100 // NOTE: These project settings all worked well somewhere around .NET 8.0.0. Later, with the upgrade of .NET runtime to later versions of .NET 8.0 and .NET 9.0 and an upgrade to Visual Studio, some of projects stopped working. It looks like they introduced breaking changes in the build tools. Logic is still sound and build types are the same, just the build tools started to behave a bit differently. A new build configurations and build scripts are needed. <!--ConsoleApp2C.csproj +++++++++++++++++++++++++++++++++++++--> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0-windows</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <PlatformTarget>x64</PlatformTarget> <Platforms>AnyCPU;x64</Platforms> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <DebugType>embedded</DebugType> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> <IsTrimmable>true</IsTrimmable> <SelfContained>true</SelfContained> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\ClassLibrary1\ClassLibraryA.csproj" /> </ItemGroup> <Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Exec Command="echo +++Post-Build+++++&#xD;&#xA; if $(ConfigurationName) == Debug ( &#xD;&#xA;echo +++++Debug+++++ &#xD;&#xA;) &#xD;&#xA;&#xD;&#xA; if $(ConfigurationName) == Release ( &#xD;&#xA; echo +++++SelfContained_SingleFile_win-x64.cmd+++++ &#xD;&#xA; call SelfContained_SingleFile_win-x64.cmd &#xD;&#xA; echo +++++SelfContained_SingleFile_win-x64_Trimmed.cmd+++++ &#xD;&#xA; call SelfContained_SingleFile_win-x64_Trimmed.cmd &#xD;&#xA;) " /> </Target> </Project> +++++Script: SelfContained_SingleFile_win-x64.cmd dotnet publish ConsoleApp2C.csproj --no-build --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=false -p:PublishTrimmed=false --output ./SelfContained_SingleFile_win-x64 +++++Script: SelfContained_SingleFile_win-x64_Trimmed.cmd dotnet publish ConsoleApp2C.csproj --no-build --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=false -p:PublishTrimmed=true --output ./SelfContained_SingleFile_win-x64_Trimmed


เหล่านี้เป็นการตั้งค่าการสร้างใหม่ที่ทำงานใน NET_8.0.11/SDK_8.0.404

 // NET_8.0.11/SDK_8.0.404 <!--ConsoleApp2C.csproj +++++++++++++++++++++++++++++++++++++--> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0-windows</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <PlatformTarget>x64</PlatformTarget> <Platforms>AnyCPU;x64</Platforms> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <DebugType>embedded</DebugType> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> <IsTrimmable>true</IsTrimmable> <SelfContained>true</SelfContained> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\ClassLibrary1\ClassLibraryA.csproj" /> </ItemGroup> <Target Name="RunAfterBuild1" AfterTargets="Build"> <Exec Command="call SelfContained_SingleFile_win-x64.cmd" Condition=" '$(BuildingInsideVisualStudio)' == 'true' "/> </Target> <Target Name="RunAfterBuild2" AfterTargets="Build"> <Exec Command="call SelfContained_SingleFile_win-x64_Trimmed.cmd" Condition=" '$(BuildingInsideVisualStudio)' == 'true' "/> </Target> </Project> +++++Script: SelfContained_SingleFile_win-x64.cmd echo .NET SDK version: dotnet --version dotnet publish ConsoleApp2C.csproj --nologo --no-restore --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=false -p:PublishTrimmed=false --output ./SelfContained_SingleFile_win-x64 +++++Script: SelfContained_SingleFile_win-x64_Trimmed.cmd echo .NET SDK version: dotnet --version dotnet publish ConsoleApp2C.csproj --nologo --no-restore --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=false -p:PublishTrimmed=true --output ./SelfContained_SingleFile_win-x64_Trimmed +++++Configfile: global.json { "sdk": { "version": "8.0.404" } }


เหล่านี้เป็นการตั้งค่าการสร้างใหม่ที่ทำงานใน NET_9.0.0/SDK_9.0.101

 // NET_9.0.0/SDK_9.0.101 <!--ConsoleApp3C.csproj +++++++++++++++++++++++++++++++++++++--> <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0-windows7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <PlatformTarget>x64</PlatformTarget> <Platforms>AnyCPU;x64</Platforms> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <DebugType>embedded</DebugType> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> <IsTrimmable>true</IsTrimmable> <SelfContained>true</SelfContained> <PublishReadyToRun>true</PublishReadyToRun> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\ClassLibrary1\ClassLibraryA.csproj" /> </ItemGroup> <Target Name="RunAfterBuild1" AfterTargets="Build"> <Exec Command="call SelfContained_SingleFile_win-x64_ReadyToRun.cmd" Condition=" '$(BuildingInsideVisualStudio)' == 'true' " /> </Target> <Target Name="RunAfterBuild2" AfterTargets="Build"> <Exec Command="call SelfContained_SingleFile_win-x64_Trimmed_ReadyToRun.cmd" Condition=" '$(BuildingInsideVisualStudio)' == 'true' " /> </Target> </Project> +++++Script: SelfContained_SingleFile_win-x64_ReadyToRun.cmd echo .NET SDK version: dotnet --version dotnet publish ConsoleApp3C.csproj --nologo --no-restore --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishTrimmed=false -p:PublishReadyToRun=true --output ./SelfContained_SingleFile_win-x64_ReadyToRun +++++Script: SelfContained_SingleFile_win-x64_Trimmed_ReadyToRun.cmd echo .NET SDK version: dotnet --version dotnet publish ConsoleApp3C.csproj --nologo --no-restore --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=true -p:PublishTrimmed=true --output ./SelfContained_SingleFile_win-x64_Trimmed_ReadyToRun +++++Configfile: global.json { "sdk": { "version": "9.0.101" } }


L O A D I N G
. . . comments & more!

About Author

Mark Pelf HackerNoon profile picture
Mark Pelf@markpelf
Mark Pelf is the pen name of a Software Engineer from Belgrade, Serbia. https://markpelf.com/

แขวนแท็ก

บทความนี้ถูกนำเสนอใน...