Wyjątki startowe usługi Windows w .NET Framework 4.8
Projekt usługi Windows IronPDF .NET Framework 4.8 rzuca FileNotFoundException podczas tworzenia ChromePdfRenderer lub StackOverflowException podczas ustawiania klucza licencyjnego. Ten sam kod działa poprawnie w konsoli lub hostingu WinForms.
Logika wykrywania fasad przez MSBuild uniemożliwia skopiowanie sześciu zestawów dostarczonych przez NuGet do katalogu wyjściowego: System.ValueTuple, System.Buffers, System.Threading.Tasks.Extensions, System.Text.Json, System.Text.Encodings.Web i System.Text.Encoding.CodePages. MSBuild zakłada, że wbudowane wersje .NET 4.8 tych zestawów są równoważne wersjom NuGet, ale przekierowania powiązań w App.config wymagają wersji NuGet. Brakujące pliki powodują wyjątek podczas startu.
Rozwiązanie
Opcja 1: Migracja do PackageReference (Zalecane)
Kliknij prawym przyciskiem na packages.config w Visual Studio i wybierz Migruj packages.config do PackageReference. Zweryfikuj, czy <AutoGenerateBindingRedirects> jest włączony w pliku .csproj, a następnie odbuduj. Integracja MSBuild z PackageReference nie wywołuje zachowania pomijania fasady.
Opcja 2: Wymuś kopiowanie DLL fasady za pomocą celu AfterBuild
Jeśli konieczne jest zachowanie packages.config, dodaj ten cel MSBuild do pliku .csproj:
<Target Name="CopyFacadeAssemblies" AfterTargets="Build">
<ItemGroup>
<FacadeAssemblies Include="..\packages\System.Buffers.4.5.1\lib\netstandard2.0\System.Buffers.dll" />
<FacadeAssemblies Include="..\packages\System.Text.Encodings.Web.6.0.1\lib\net461\System.Text.Encodings.Web.dll" />
<FacadeAssemblies Include="..\packages\System.Text.Json.6.0.11\lib\net461\System.Text.Json.dll" />
<FacadeAssemblies Include="..\packages\System.Text.Encoding.CodePages.5.0.0\lib\net461\System.Text.Encoding.CodePages.dll" />
<FacadeAssemblies Include="..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll" />
<FacadeAssemblies Include="..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll" />
</ItemGroup>
<Copy SourceFiles="@(FacadeAssemblies)" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true" />
</Target>
<Target Name="CopyFacadeAssemblies" AfterTargets="Build">
<ItemGroup>
<FacadeAssemblies Include="..\packages\System.Buffers.4.5.1\lib\netstandard2.0\System.Buffers.dll" />
<FacadeAssemblies Include="..\packages\System.Text.Encodings.Web.6.0.1\lib\net461\System.Text.Encodings.Web.dll" />
<FacadeAssemblies Include="..\packages\System.Text.Json.6.0.11\lib\net461\System.Text.Json.dll" />
<FacadeAssemblies Include="..\packages\System.Text.Encoding.CodePages.5.0.0\lib\net461\System.Text.Encoding.CodePages.dll" />
<FacadeAssemblies Include="..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll" />
<FacadeAssemblies Include="..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll" />
</ItemGroup>
<Copy SourceFiles="@(FacadeAssemblies)" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true" />
</Target>
Dostosuj numery wersji, aby pasowały do dokładnych wersji przywróconych w katalogu packages.
Ustawienie <Private>True</Private> (Copy Local) dla odwołań fasadowych nie rozwiązuje problemu; Detekcja fasady MSBuild nadal blokuje krok kopiowania.

