.NET Framework 4.8 Windows Dienst-Startausnahmen
Ein IronPDF .NET Framework 4.8 Windows Service Projekt löst FileNotFoundException aus, wenn ChromePdfRenderer konstruiert wird, oder StackOverflowException, wenn der Lizenzschlüssel gesetzt wird. Der gleiche Code funktioniert korrekt in einem Konsolen- oder WinForms-Host.
Die Fassadeerkennung von MSBuild verhindert, dass sechs von NuGet bereitgestellte Assemblys in das Ausgabeverzeichnis kopiert werden: System.ValueTuple, System.Buffers, System.Threading.Tasks.Extensions, System.Text.Json, System.Text.Encodings.Web und System.Text.Encoding.CodePages. MSBuild geht davon aus, dass die in-box .NET 4.8-Versionen dieser Assemblys den NuGet-Versionen entsprechen, aber die Binding-Redirects in App.config erfordern die NuGet-Versionen. Die fehlenden Dateien verursachen die Ausnahme beim Start.
Lösung
Option 1: Migration zu PackageReference (Empfohlen)
Rechtsklicken Sie in Visual Studio auf packages.config und wählen Sie Pakete.config in PackageReference migrieren. Verifizieren Sie, dass <AutoGenerateBindingRedirects> in der .csproj Datei aktiviert ist, und bauen Sie dann neu auf. Die MSBuild-Integration von PackageReference führt nicht zu dem Fassade-Überspringen-Verhalten.
Option 2: Erzwingen der Kopie von Fassade-DLL mit einem Nachbauziel
Falls das Beibehalten von packages.config erforderlich ist, fügen Sie dieses MSBuild-Ziel zur .csproj Datei hinzu:
<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>
Passen Sie die Versionsnummern an, um mit den exakten Versionen übereinzustimmen, die in Ihrem packages Verzeichnis wiederhergestellt wurden.
Das Setzen von <Private>True</Private> (Copy Local) auf Fassadeverweise löst das Problem nicht; Die Fassade-Erkennung von MSBuild blockiert weiterhin den Kopiervorgang.

