Net-Base Magasin

07.06.2026

C# og Delphi i en felles arkitektur: pragmatisk integrasjon fremfor enten-eller

Mange virksomheter drifter etablerte Delphi-desktopapplikasjoner og bygger parallelt nye C#-tjenester og portaler. Artikkelen viser hvordan C# og Delphi i en felles arkitektur samarbeider ryddig: gjennom klare lag, stabile grensesnitt, felles...

07.06.2026

Fra magasinetema til prosjektpraksis

Egnede tjeneste- og tekniske sider for innlegget

I mange IT-avdelinger er utgangspunktet likt: En stabil, prosessnær Delphi-desktopapplikasjon bærer kritiske arbeidsprosesser, mens nye krav presser mot web, portaler, mobilbruk og integrasjon med skytjenester. Samtidig er C# etablert i mange virksomheter når det gjelder tjenester, web-APIer og identity-integrering. Det sentrale spørsmålet er derfor ikke lenger «Delphi eller C#?», men: C# og Delphi i en felles arkitektur kombinert slik at drift, vedlikehold, datalagring og sikkerhet forblir håndterbare.

Denne artikkelen beskriver praksisnære arkitekturprinsipper som fungerer i bedriftsmiljøer hvor ikke alt kan eller bør bygges på nytt. Fokuset ligger på klare ansvarsområder mellom desktop-klient, tjenester, data og grensesnitt — og på hvordan du kan planlegge moderniseringstiltak med lav risiko, uten å sette de løpende prosessene i fare.

Hvorfor blandede teknologistabler er normalt i virksomheter

Organisk vokste digitale virksomhetsløsninger oppstår sjelden fra bunnen av. Delphi-applikasjoner er ofte blitt utvidet over mange år, tett på fagprosessene, med omfattende datalogikk og inngående kjennskap til spesialtilfeller. Parallelt har nye krav oppstått: selvbetjeningsportaler, automatiserte datautvekslinger, tilknytning til DMS/CRM/ERP, flerleietakerstøtte, økt revisjonssporbarhet eller Single Sign-on.

C# tilbyr i denne sammenhengen ofte fordeler for web- og tjenesteøkosystemer: bredt hostingspekter, standardisert middleware, god integrasjon mot identitetsleverandører og etablerte mønstre for web-APIer. Delphi forblir derimot sterkt når det gjelder ytelsessterke Windows-desktopklienter, langsiktig vedlikeholdte VCL-applikasjoner eller spesifikke multiplattform-klienter (f.eks. via FMX).

Blandingen er derfor ikke et «særtilfelle», men et realistisk svar på investeringsbeskyttelse og moderniseringstrykk. Avgjørende er at felles drift ikke blir en permanent byggeplass.

Arkitekturprinsipp: klare lag i stedet for språkgrenser

Når to språk møtes, er fristelsen stor til å organisere separasjonen langs teknologilinjer («Alt Delphi er legacy, alt C# er nytt»). Teknisk fungerer dette ofte på kort sikt, men på lang sikt fører det til friksjon: doble forretningsregler, uklare ansvarsforhold og vanskelig reproducerbare feil.

I stedet har en faglig lagdeling vist seg å fungere, ofte implementert som Layer-3 Arkitektur: Presentasjon (UI), domene (forretningslogikk) og infrastruktur (dataadgang, eksterne systemer). Poenget er ikke lærebokmodellen i seg selv, men den konkrete effekten i hverdagen: beslutninger om data, valideringer og arbeidsflyter tas ett sted og eksponeres gjennom stabile grensesnitt.

I en blandet arkitektur betyr dette i praksis: Delphi kan fortsatt levere en UI-del (eller bestemte arbeidsflyter), mens C# Services kapsler en faglig domenelag — eller omvendt. Viktig er at kanten mellom lagene er teknisk ren og testbar.

C# og Delphi i en felles arkitektur: tre velprøvde integrasjonsmønstre

For koblingen mellom Delphi og C# finnes det ikke «den ene» riktige måten. Gode beslutninger baseres på drift, sikkerhetskrav, latenstid, datavolum og release-sykluser. I praksis har tre mønstre etablert seg.

1) Tjenesteorientering over HTTP/REST som standardkobling

Ofte er en kobling via REST-APIer (HTTP-baserte grensesnitt) mest robust for drift og videreutvikling. Delphi-klienter kaller C#- eller Delphi-tjenester; C#-portaler bruker de samme endepunktene. Denne avkoblingen gjør releaser mer planbare: En klientoppdatering er ikke nødvendigvis påkrevd så lenge APIen forblir bakoverkompatibel.

Viktig er profesjonell utforming: timeouts, retries, idempotens (gjentatte forespørsler uten sideeffekter), klare feilkoder og en versjoneringsstrategi. For administrasjon og drift teller også: enhetlige logger, ettersporbare request-IDer og godt målbare svartider.

2) Felles database: kun med klare spilleregler

Direkte felles databaseadgang fra Delphi og C# er fristende fordi det ofte går raskt i starten. På lang sikt er det risikabelt hvis begge sider skriver direkte i samme tabellsett. Årsaken: Forretningsregler flyttes inn i triggere, stored procedures eller «et sted i klienten». Det kompliserer feilanalyse og revisjoner.

Hvis en felles database er uunngåelig (f.eks. i overgangsfaser), hjelper klare regler:

  • Sentraliser skriveaksesser: ett system er «System of Record» for bestemte entiteter.
  • Definer kontrakter: views eller APIer som stabilt leselag i stedet for direkte tabelltilgang.
  • Planlegg migrasjonsvinduer: rull alltid ut databaseendringer bakoverkompatibelt (f.eks. nye kolonner først valgfrie).

Teknisk er databasen da en infrastrukturkomponent, ikke integrasjonsbussen.

3) Messaging/Events for asynkrone prosesser

For avkoblede arbeidsflyter (f.eks. importkjøringer, varsler, etterbehandling, grensesnittjobber) er en asynkron modell hensiktsmessig: Ett system publiserer hendelser, et annet behandler dem. Det reduserer direkte avhengigheter og stabiliserer lasttopper.

For IT-ledelse og administratorer er dette viktig: monitoring (kø-lengder), dead-letter-konsepter (feilslåtte meldinger), gjenstartatferd og klar faglig idempotens. Events er ingen erstatning for ryddig stamdatahåndtering, men et godt verktøy for robuste prosesskjeder.

Datakontrakter og kompatibilitet: den undervurderte kjernen

Uavhengig av integrasjonsmønster avgjør kvaliteten på datakontraktene stabiliteten. En datakontrakt er den bindende beskrivelsen av felter, typer, obligatorisk/valgfritt og semantikk. I REST-APIer er dette typisk JSON; det viktige er ikke «JSON i seg selv», men disiplinen i håndteringen av endringer.

Innarbeidede regler som forenkler drift merkbart:

  • Utvide i stedet for å bryte: legg til nye felter, lever gamle fortsatt i første omgang.
  • Dokumenter feltsemantikk: ikke bare «string», men f.eks. ISO-dato, tidssone, tillatte tilstander.
  • Behandle enum-verdier tolerant: klienter må tåle ukjente verdier (fremoverkompatibilitet).
  • Bruk API-versjonering bevisst: ikke hver release krever en ny versjon; men breaking changes må være tydelig kapslet inn.

Disse punktene er spesielt viktige når Delphi-desktop-klienter ikke kan oppdateres like hyppig som webtjenester.

Autentisering og autorisering: en felles sikkerhetsmodell

Blandede arkitekturer svikter sjelden på «teknikken», oftere på inkonsekvent sikkerhet. For virksomheter gjelder: Hvem får gjøre hva? Hvordan blir det sjekket? Hvordan blir det revidert? En felles modell unngår dobbel brukeradministrasjon og motstridende roller.

I praksis fører dette til et sentralt identitetslag: for eksempel via SAML 2.0 (føderert Single Sign-on, vanlig i enterprise-miljøer) eller OpenID Connect (basert på OAuth2, ofte for moderne web-APIer). C#-Services lar seg som regel koble direkte til en Identity Provider; Delphi-klienter kan hente tokens og sende dem med ved API-kall. Det er viktig at også skrivebordsapplikasjoner ikke får «særrettigheter» via direkte databasetilgang.

Sentralt for administratorer:

  • Token-levetider og refresh-strategi (slik at klientene kjører stabilt og samtidig er sikre)
  • Tjeneste-til-tjeneste-autentisering for intern kommunikasjon (f.eks. mTLS eller signerte tokens)
  • Least Privilege: roller og rettigheter ikke for grovt definert
  • Audit-logger: loggfør sikkerhetsrelevante handlinger på en etterprøvbar måte

Driftskonsepter: Windows- og Linux-Services, IIS og prosesser i det daglige

En arkitektur er bare «god» i virksomheten hvis den er driftbar: oppdateringer kan planlegges, feil kan lokaliseres, belastning kan håndteres. I hybride landskap er de vanligste driftsvariantene:

  • Windows- og Linux-tjenester: egnet for bakgrunnsjobber, grensesnittkjøringer, workere; godt integrerbare i klassiske Windows-serverdriftsmodeller.
  • Windows- og Linux-tjenester/Daemon: hensiktsmessig for containeriserte eller VM-baserte driftsmodeller; ofte stabil i kontinuerlig drift, god automatisering via systemd.
  • Microsoft IIS: etablert hosting for webapplikasjoner og reverse-proxy-scenarier i Windows-sentrerte miljøer.

Det er viktig at Delphi- og C#-komponenter oppfyller lignende driftsstandarder: konsistente Health-Endpoints (livstegn), definerte timeouts, begrenset ressursbruk, samt en klar deployment- og rollback-prosedyre. Dette reduserer «teknologispesifikke» særbehandlinger.

Logging, Tracing og Metriken: et felles Observability-nivå

Spesielt med to teknologistakker er gjennomgående diagnosekjeder avgjørende. Et typisk problem: Delphi-klienten rapporterer «Fehler beim Speichern», C#-tjenesten har en timeout, databasen melder låser – uten en felles sammenheng.

Følgende har vist seg å være effektivt:

  • Korrelasjons-IDer per forespørsel (Client → API → DB), slik at logger kan kobles sammen.
  • Strukturert logging (nøkkel/verdi i stedet for rene tekstlinjer), for å kunne filtrere senere.
  • Metrikker for latenstid, feilrater, kølengder og ressursbruk.
  • Feilklassifisering: forretningsfeil (validering) atskilt fra tekniske feil (timeout, nettverk).

Disse grunnprinsippene sparer i praksis mer tid enn enhver diskusjon om «det riktige språket».

Datatilgang og migrasjon: BDE-utskifting, FireDAC og moderne databaser

I Delphi-bestand har datatilgang historisk spilt en stor rolle. Der hvor gamle tilgangsveier som Borland Database Engine (BDE) fortsatt er i bruk, oppstår ekstra press: operativsystemoppdateringer, 64‑bit-overganger, drivertilgjengelighet, sikkerhetskrav. En BDE-utskifting er da ikke bare modernisering, men risikoreduksjon.

Typisk er overgangen til en BDE-utskifting med native tilkobling (moderne datatilgangslager i Delphi), kombinert med en database som er driftsmessig håndterbar (f.eks. PostgreSQL, SQL Server, MariaDB). For en felles Delphi/C#-arkitektur er to aspekter viktige:

  • Transaksjonsgrenser: Hvem starter/committer transaksjoner, og hvordan reguleres parallelle skriveoperasjoner?
  • Locking- og isolasjonsstrategi: slik at desktop-arbeidsflyter og tjenester ikke blokkerer hverandre.

Ved migrasjoner lønner en trinnvis plan seg: først modernisere driver- og tilgangslaget, så konsolidere datamodellen, deretter stabilisere integrasjonssnitt. Slik blir feilkilder isolerbare og rollbacks realistiske.

Release-håndtering: få ulike oppdateringssykluser til å fungere sammen

Et tilbakevendende spenningsfelt er oppdateringsfrekvensen: webtjenester kan rulles ut oftere, desktop-klienter ofte sjeldnere (utrullingsvinduer, brukerkommunikasjon, pakking). En felles arkitektur må ta hensyn til denne asymmetrien.

Praktiske konsekvenser:

  • API-bakoverkompatibilitet er obligatorisk, ikke valgfritt.
  • Feature flags (funksjonelle brytere) hjelper med å aktivere nye funksjoner kontrollert på serversiden.
  • Skjemamigrasjoner må kjøres i faser: utvide databasen først, la tjenesten bruke den, og så la klienten følge etter.
  • Tydelig utfasing: fjern gamle endepunkter eller felter først etter en definert periode.

Særlig i regulerte omgivelser er det viktig å fastsette disse reglene skriftlig som arkitekturretningslinjer, slik at beslutninger ikke må oppfinnes på nytt i hvert prosjekt.

Typiske snubletråder og hvordan man systematisk unngår dem

Fra driftssynspunkt er de vanligste problemene i blandede Delphi/C#-landskap godt forutsigbare. Hvis de adresseres tidlig, reduseres de langsiktige kostnadene merkbart.

Snubletråd 1: dobbel forretningslogikk

Når Delphi-klient og C#-tjeneste implementerer de samme reglene ulikt, oppstår «spøkelsesfeil»: en prosess fungerer i UI, men feiler ved API-import. Mottiltak: sentraliser regler i domenelaget (tjeneste) eller tilordne dem faglig tydelig, inkludert entydige valideringssvar.

Snubletråd 2: UI-omgåelser i stedet for rene grensesnitt

«Bare skriv raskt et databasefelt» virker i enkelttilfeller harmløst, men skaper skyggegrensesnitt uten logging, autentisering og versjonering. Bedre: gå konsekvent via definerte endepunkter, selv om det i starten krever mer disiplin.

Snubletråd 3: uklare ansvarsområder i driften

Hvis det ikke er klart hvilket team som er ansvarlig for hvilken tjeneste, hvilke logger og hvilke driftsparametere, ender feilsøkingen i ping-pong. Praktisk hjelper et tjenestekart (hvilken tjeneste, hvilke avhengigheter, hvilke porter, hvilke interne SLA-er) og ensartede Runbooks for hyppige feil.

Fallgruve 4: manglende sikkerhetskonsistens

Et portal med SSO, men en desktopklient med lokale administrator-kontoer er i mange revisjoner et problem. Et felles identitets- og rollemodell reduserer risiko og støttebelastning.

Beslutningsstøtte: Hva blir værende i Delphi, hva går til C#?

En fornuftig fordeling avhenger mindre av ideologi enn av prosessnærhet og driftskrav. Som orientering fra et arkitektur- og driftsperspektiv:

  • Delphi er ofte godt for: eksisterende Windows-desktopklienter (VCL), svært reaktive UI-arbeidsflyter, offline-nære scenarier, langsiktig vedlikehold av etablerte brukergrensesnitt.
  • C# er ofte godt for: sentrale REST-API-er, integrasjonstjenester mot ERP/DMS/CRM, identitetsnære komponenter, portaler og backend-prosesser med høy endringsfrekvens.
  • Bevisst avgjørelse: datalogikk og validering bør ikke ligge „i klienten“ når flere frontend finnes (desktop, portal, importjobber).

Viktig: Målet er ikke «alt til C#», men en robust totalarkitektur hvor moderniseringstrinn kan planlegges og forretningsprosessene går stabilt.

Moderniseringsvei: Trinnvis fra applikasjon til system

I praksis er en felles arkitektur ofte et overgangsstadium, men et langt ett. En realistisk moderniseringsvei unngår storprosjekter med høy risiko og satser på målbare delmål:

  1. Stabilisere grensesnitt: REST-API som faglig avgrensning, innføres selv om ikke alt internt er „pent“ ennå.
  2. Modernisere datatilgang: BDE-utskifting, drivere, 64-bit-støtte, klare transaksjoner.
  3. Sentralisere identitet: SSO og rollemodell for alle tilgangsveier.
  4. Standardisere drift: Logging/Monitoring/Health, klare utrullinger, reproduserbare miljøer.
  5. Frikoble fagmoduler: flytt spesielt endringsintensive deler til tjenester, slank UI trinnvis.

Denne rekkefølgen er ikke dogmatisk, men den minimerer typisk avhengigheter: Uten stabile grensesnitt og et driftskonsept blir enhver videre endring dyrere.

Konklusjon: Integrasjon er en arkitekturoppgave, ikke et språkspørsmål

En bærekraftig kombinasjon av Delphi og C# oppstår ikke gjennom „brobiblioteker“, men gjennom klare faglige kanter, rene datakontrakter og et driftskonsept som tar overvåking, sikkerhet og releasehåndtering på alvor. Når C# og Delphi i en felles arkitektur bevisst spiller sammen langs ansvarsområder, vinner virksomheter først og fremst ett: modernisering uten prosessbrudd. Delphi kan fortsatt pålitelig bære stabile desktop-workflows, mens C#-tjenester leverer integrasjon, web-APIer og portaler som sentrale plattformfunksjoner.

Hvis du ønsker å modernisere en eksisterende Delphi-landskap trinnvis eller knytte C#-tjenester på en ryddig måte, er en arkitekturgjennomgang med fokus på grensesnitt, data, drift og sikkerhet den raskeste veien til robuste beslutninger. Mer om dette i direkte dialog:

I faglig sammenheng spiller også Delphi modernisering og REST-API for eksisterende programvare en viktig rolle når integrasjoner, dataflyt og videreutvikling må fungere sømløst sammen.

Drøft prosjekt eller moderniseringsprosjekt med Net-Base.

Neste trinn

Når et tema blir et reelt prosjekt, bør arkitektur, eksisterende systemer og drift vurderes samlet allerede tidlig i prosessen.

Vi bistår ikke bare med enkeltspørsmål, men også når kodesnutter, legacy-temaer eller portalideer skal utvikles til et robust virksomhetsprosjekt.

  • Eksisterende tilstand, målbildet og tekniske risikoer vurderes samlet.
  • REST, datatilgang, portaler og utrulling blir ikke utsatt som etterfølgende oppgaver.
  • Dere ser tidlig hvilken vei som er økonomisk og driftsmessig levedyktig.

Del innlegg

Del dette innlegget direkte

LinkedIn, X, XING, Facebook, WhatsApp og e-post er umiddelbart tilgjengelige. For Instagram forbereder vi lenke og kort tekst umiddelbart.

E-post

Instagram åpnes i en ny fane. Lenken og kortteksten kopieres først til utklippstavlen.