2015-09-18 5 views
14

TL; DR: quali sono le opzioni al giorno d'oggi per eseguire una soluzione VS2015 su Linux?Esecuzione di un'app .NET in Linux nel 2015


Ho un'applicazione .NET che funziona bene in Windows e ho ricevuto richieste per portarlo su Linux. Ho cercato molto duramente di capire cosa significasse oggi nel 2015, ma sono davvero confuso con tutti i vecchi post che puntano a Mono e ai nuovi post che parlano di vNext (e menziono ancora Mono). Ho anche una buona conoscenza di .NET, ma non ne so molto di Linux in generale ...

Ho seguito un recente tutorial e sono riuscito a compilare ed eseguire un'app della console Hello World in Linux. Ciò ha richiesto l'installazione di alcune cose che non conosco, incluso Mono, e quindi eseguendo alcuni comandi "k" (ripristino di kpm, kpm build, k run). Tuttavia ora non so come passare al mio caso caso reale.

ho una soluzione VS2015 che ha un sacco di progetti, ma solo 4 vale la pena ricordare: - CommonStuff - ServiceCore - ServiceWindows/ServiceConsole

Tutto il codice è nel progetto ServiceCore (libreria di classi) , che ha anch'esso un riferimento a CommonStuff (un'altra libreria di classi). ServiceWindows è un progetto di servizio Windows che chiama semplicemente la funzione Main di ServiceCore e ServiceConsole fa la stessa cosa ma in un'app console (per motivi di debug, poiché non è possibile eseguire il debug di un progetto di servizio Windows da Visual Studio).

Sia CommonStuff che ServiceCore includono molte librerie .NET e alcune DLL di terze parti. Nessun codice specifico di Windows, tuttavia, niente pinvoke o roba funky.

Se consideriamo ServiceConsole come l'app che voglio eseguire su Linux, cosa devo fare per realizzarlo? Compilare Hello World era una cosa ma ora, con tutti quei riferimenti ... Non so da dove cominciare. Inoltre, non posso nemmeno avere il codice da compilare in Linux (codice proprietario), quindi ho bisogno che il codice da compilare in Windows e il dll/exe compilato per essere eseguito direttamente in Linux - è qualcosa che è possibile? Ho visto alcuni post che dicono che Mono può eseguire applicazioni compilate, ma ogni Mono turorial che ho visto inizia con la compilazione. Inoltre non sono sicuro di cosa sia questo vNext. Leggo cose sulla capacità di eseguire codice in Linux se è destinato a .net 6 ... ma non ho idea di come o cosa significhi.

Apprezzerei molto se qualcuno potesse prendere del tempo per spiegare in alcuni dettagli quali sono le opzioni al giorno d'oggi e se è realistico per un'applicazione professionale o se è ancora buono solo per Hello Worlds.

Grazie

EDIT: Ok così sembra posso compilare il mio codice in VS e in qualche modo eseguirlo su Linux utilizzando Mono - come?

+1

_ "Servizio Windows [...] niente specifico per Windows" _ non calcola. Vedi [Come migrare un'applicazione di servizio Windows .NET a Linux usando mono?] (Http://stackoverflow.com/questions/637948/how-to-migrate-a-net-windows-service-application-to-linux- using-mono). vNext o ASP.NET 5 è la prossima cosa per le applicazioni web, quindi non pertinente alla tua situazione. Non posso aiutarti oltre, non ho provato a eseguire .NET su Mono oltre "Hello, World!" anche. – CodeCaster

+0

Codice I.Net/Mono applicazioni orientate ai servizi su OS-X e distribuire i CIL risultanti alla piattaforma Windows e Linux per tutto il tempo ... Questa domanda è così generale che non può essere data una risposta diretta. Mono è una valida piattaforma CLR per eseguire applicazioni xplat, sì ... Oltre 'Hello World', sì, App professionali? sì, certo, ecc. Le risposte reali saranno basate sulla tua applicazione, sul tuo codice, sull'esperienza utente richiesta, sui requisiti della piattaforma, ecc ... Hai dichiarato che non stai usando InterOp non gestito, ma quale codice specifico per Windows, se ce ne sono, usa il tuo servizio, ecc ... – SushiHangover

+0

Non penso che sia così importante che sia un servizio di Windows. È solo un codice che eseguo come servizio di Windows, ma come ho detto, potrebbe essere eseguito come un'applicazione di console. Per essere più specifici, lo scopo dell'applicazione è quello di attendere le richieste in attesa (ricevute tramite SignalR, quindi websockets o polling lungo) e quindi connettersi ad alcuni database (ad esempio mysql, gestito da dll di terze parti) per inviare finalmente i dati a un nostro servizio web. L'unica cosa specifica per Windows è scrivere nei registri di Windows, ma posso sostituirlo facilmente con la scrittura su qualche file per Linux. – Nicolas

risposta

14

Spesso sviluppo applicazioni multipiattaforma o linux-only, utilizzando Visual Studio 2015 su Windows. Puoi semplicemente compilarlo in VS, copiare su Linux ed eseguire - quasi sempre funzionerà. Se si esegue uno sviluppo serio, è possibile che si desideri compilare in modalità mono per individuare alcuni metodi mancanti \ firme diverse, ma non è necessario .

Ora, il servizio Windows può essere modificato per l'applicazione della console. Fondamentalmente è solo un'applicazione console gestita da uno strumento esterno. Su Linux ci sono diversi strumenti che ti permettono di gestire (avviare \ stop \ riavvio in caso di errore e così via) le tue applicazioni di "servizio".

Per le applicazioni Web di solito utilizzo ServiceStack, che gira su mono senza problemi. Puoi persino auto-ospitarlo di nuovo come applicazione per console, dietro a nginx. Puoi anche ospitare le applicazioni asp.net con apache \ nginx, con poche o nessuna modifica al codice.

Un anno fa ho "portato" un grande progetto che è stato sviluppato per 2 anni dal server Windows al server CentOS 7, per lo più copiando roba in centos e in esecuzione (con pochissime modifiche, senza ricompilazione in mono). Ovviamente quel progetto aveva molte dipendenze da terze parti, e alcuni sviluppatori di quelle dipendenze non sapevano nemmeno che esiste mono. Tuttavia hanno appena funzionato. E quella soluzione aveva circa 90 progetti VS.

Ovviamente, non tutti i progetti complessi sono così facili da eseguire, specialmente se si utilizzano spesso le librerie native, ma in genere non è così. Inoltre, se si lavora con SQL Server, si noti che il driver del server SQL in mono è piuttosto negativo per la mia esperienza. Io uso Postgre ed evito sql server con mono se ho una scelta. Anche lavorare con le immagini in mono non è molto buono, buggato e instabile. Evito di usare la classe Bitmap lì a tutti i costi e preferisco invece inserire in api C di imagemagick. Ma è necessario farlo solo se si esegue un'imaging serio ed esteso, per le attività di base va bene.

Per farla breve: l'esecuzione di un'app .NET in Linux nel 2015 non è un problema al giorno d'oggi.

+0

"Si può solo compilarlo in VS, copiare su linux ed eseguire "- Posso compilare in VS e copiare su linux - ma in che modo esattamente eseguo? Quale comando devo eseguire? Puoi dare maggiori dettagli? – Nicolas

+0

Basta installare Mono. Non sono davvero sicuro di quale sia il tuo problema? – user9993

+0

@Nicolas, Installa mono, quindi fai "mono YourConsoleApp.exe". Se si desidera eseguire sotto il gestore servizi, basta leggere come eseguire eventuali app sottostanti (non correlate a mono). – Evk