Chiamando il codice Delphi dal programma C #

1

Ho dozzine di funzioni di Delphi (versione 10.2.2 Tokyo) che vorrei essere accessibili da un progetto Web C # MVC. Queste funzioni sono principalmente query di report che accettano un sacco di parametri di input e restituiscono un array (o un elenco) di record (o oggetti) come risultato.

Ho il pieno controllo su entrambe le basi di codice, Delphi e C #. Quale sarebbe la migliore architettura in questo scenario per condividere il codice base? DLL sarebbe un'opzione ma non mi piacciono i dettagli di basso livello che ne derivano, quali sono le opzioni migliori?

Obs: le funzioni devono essere disponibili per essere chiamate da entrambi, Delphi e C # code.

    
posta Rafael Piccolo 15.02.2018 - 13:26
fonte

2 risposte

8

In un precedente lavoro, abbiamo fatto esattamente quello che stai descrivendo: un server web ASP.NET che ha dato un sacco di peso a una base di codice Delphi nativa. Avevamo due metodi che usavamo.

Il primo era metterne un sacco in una DLL, che era registrata con Windows come server COM out-of-process. Questo evita gran parte degli incisivi livelli di hacker a basso livello con P / Invoke, ma ti dà un mucchio di hacker di basso livello disordinati sul lato di Delphi, quindi è una sorta di compromesso lì.

Il secondo metodo consisteva nel creare il codice Delphi come server REST e fare in modo che il codice C # effettuasse le chiamate al servizio web. Ciò fornisce un'interfaccia molto più pulita, al costo di un po 'di prestazioni. Abbiamo usato questo metodo per l'elaborazione di database pesanti, il tipo di elementi in cui il sovraccarico di una chiamata HTTP non sarebbe stato notato e la DLL COM per roba più rigida in cui l'efficienza contava di più.

Il fatto che il codice nativo interagisca con il codice gestito sarà disordinato in un modo o nell'altro; si tratta davvero di un compromesso ingegneristico e quale varietà di problemi finisce per funzionare al meglio per le tue esigenze.

    
risposta data 15.02.2018 - 14:11
fonte
4

Un'altra soluzione indipendente dalla lingua potrebbe essere quella di fornire al codice Delphi un'interfaccia a riga di comando, passare i parametri tramite un file di input (testo normale, XML o JSON) e restituire i risultati della query in alcuni file di output (testo normale, XML o JSON, qualunque cosa tu preferisca). Chiamare lo strumento da riga di comando e elaborare l'input e l'output può essere fatto in quasi tutti i linguaggi di programmazione che ti piacciono.

Ovviamente, questa è solo una soluzione utile se ogni query può essere un processo di breve durata, senza necessità di riutilizzare qualcosa come una lunga connessione di database.

In passato abbiamo utilizzato un'interoperabilità basata su file per collegare il vecchio codice C ++ a 16 bit con il nuovo codice C #. In realtà non era troppo difficile creare una soluzione solida e l'impatto sulle prestazioni dell'uso dei file risultava trascurabile per i nostri casi d'uso (ma YMMV).

    
risposta data 16.02.2018 - 14:33
fonte

Leggi altre domande sui tag