Migracja
Upgrade to Doconut on .NET 8
Na tej stronie znajdują się dwie migracje: aktualizacja wersji pakietu w .NET 8 oraz przeniesienie integracji ze starszego frameworka Doconut (.NET 6, .NET Standard 2.0, .NET Framework 4.7) na API .NET 8.
Aktualizacja wersji pakietu
- Zaktualizuj pakiet (oraz wszystkie pakiety wtyczek — utrzymaj wersje zgodne):
dotnet add package Doconut.NET8
dotnet add package Doconut.NET8.Dicom-
Sprawdź okno licencji. Licencja obejmuje zakres wersji. Jeśli nowa wersja znajduje się poza tym zakresem, otwieranie jest zablokowane —
OpenDocumentAsyncrzucaLicenseException(szybkie zakończenie); nie przechodzi do znaku wodnego, aIsVersionValidzwracafalse. Odnów, wymień plik.lici uruchom ponownie aplikację, abyAddDoconut()załadował nową licencję. -
Przebuduj i pozwól NuGet przywrócić zadeklarowane wersje zależności — nie przypinaj ponownie
System.Text.JsonaniSystem.Drawing.Common(zobacz sekcję Rozwiązywanie problemów, aby poznać dokładne błędy spowodowane degradacją wersji). -
Wykonaj test dymny jednego dokumentu dla każdej rodziny formatów, której używasz.
Migracja z .NET 6 / .NET Standard 2.0
API .NET 8 to przedefiniowanie wokół DI i asynchroniczności. Mapowanie:
| Kwestia | .NET 6 / Standard 2.0 | .NET 8 |
|---|---|---|
| Setup | Construct Viewer(cache, httpContextAccessor, licensePath) | builder.Services.AddDoconut(options => …) + inject Viewer |
| License | Static Viewer.DoconutLicense(path) + SetLicensePlugin(...) per plugin | options.LicensePath / LicenseContent / LicenseStream — one license, auto-discovery for plugin files |
| Open | viewer.OpenDocument(...) (synchronous) | await viewer.OpenDocumentAsync(...) |
| Close | viewer.CloseDocument() or viewer.Dispose() | viewer.CloseDocument(token) — Viewer is not IDisposable |
| Lifetime | Viewer implements IDisposable, holds the open document | Viewer is stateless; sessions live in the cache under tokens |
| Converter | viewer.Converter property | The Converter plugin (AddPlugin<ConverterPlugin>()) + the DocumentConverter service |
| Config classes | Doconut.Configs.View.* namespaces | All in the Doconut namespace |
| Middleware | Manual handler wiring | app.UseDoconutResources() + app.UseDoconut() |
Typowy przykład przed/po:
// .NET 6 (old API, shown for contrast — not valid on .NET 8)
using var viewer = new Viewer(cache, httpContextAccessor, "wwwroot/Doconut.Viewer.lic");
var token = viewer.OpenDocument(path, new PdfConfig { AllowSearch = true }, new DocOptions());// .NET 8 — Viewer injected, license configured once in AddDoconut()
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { AllowSearch = true });Migracja z .NET Framework 4.7 (Web Forms)
Viewer w wersji 4.7 jest WebControl; .NET 8 zastępuje model kontrolki pośrednikiem + usługą DI:
- Kontrolka
<doconut:DocViewer runat=server>znika — strona hostuje parę elementówdivwidgetu, a Twój punkt końcowy zwraca token (Quick Start pokazuje ten wzorzec). - Statyczne metody licencji → źródła licencji
DoconutOptions. - Synchroniczne
OpenDocument→await OpenDocumentAsync. Viewer.ReferenceScripts()/ReferenceCss()istnieją w obu światach — wersje .NET 8 przyjmują obiektyScriptConfig/CssConfigi są zabezpieczone licencją.- Właściwości kontrolki (
ShowThumbs,PageZoom,FixedZoom, …) → te same nazwy wViewerConfig/ opcjach JSdocViewer. - Metody eksportu zwracające
byte[]→ asynchroniczne API eksportu adnotacji wViewer.
Zaplanuj to jako przepisanie warstwy hostującej wokół niezmienionego konceptu: otwarcie → token → widget.
Uwaga dotycząca nazewnictwa
We wszystkich frameworkach klasa to Viewer — jeśli znajdziesz DocumentViewer w starych fragmentach kodu lub artykułach firm trzecich, ten typ nigdy nie istniał w SDK.
Lista kontrolna migracji
- Zamień pakiety; dopasuj wersje pakietów wtyczek.
- Przenieś konfigurację licencji do
AddDoconut(); usuń statyczne wywołania licencji. - Uczyń wywołania otwierania asynchronicznymi; zamień
Dispose/CloseDocumentbez parametrów naCloseDocument(token). - Zastąp użycia
viewer.Converterrejestracją wtyczki Converter +DocumentConverter. - Ponownie przetestuj ścieżkę bezpieczeństwa:
AddSession()/UseSession()są teraz wymagane przy domyślnym zabezpieczeniu.
Czy ta strona była pomocna?