2011-03-25 8 views
12

Questa domanda è ispirata alla domanda: In what areas does F# make "absolute no sense in using"?Perché i progetti di Visual Studio sono limitati a una singola lingua?

In teoria, dovrebbe essere possibile utilizzare qualsiasi linguaggio supportato da .NET in un singolo progetto. Poiché ogni cosa dovrebbe essere compilata nel codice IL, quindi collegata in un unico assembly.

Alcuni vantaggi includono la possibilità di usare dire F # per una classe, dove F # è più adatto per implementare la sua funzione, e C# per un'altra.

C'è qualche limite tecnico che sto trascurando che impedisce questo tipo di configurazione?

risposta

13

Un progetto è limitato a una singola lingua perché, sotto la cappa, un progetto non è molto più di uno script MSBuild che chiama uno dei compilatori da riga di comando per produrre un assembly dai vari file di codice sorgente "contenuto" nella cartella del progetto. Esiste un compilatore diverso per ogni lingua (CSC.exe è ad esempio quello per C#) e ciò che ciascun progetto deve fare per trasformare il suo codice sorgente "contenuto" in un assembly è diverso con ciascuna lingua.

Per consentire la compilazione di più lingue in un unico assieme, il progetto dovrebbe fondamentalmente produrre un assembly per ogni lingua, quindi IL-Unire. Questo è costoso, richiede automazione complessa e generazione di codice di file di progetto, e nella maggior parte dei casi è un bisogno piuttosto marginale, quindi il team VS semplicemente non lo ha creato.

+14

Penso che produrre assembly per ogni lingua e IL-fonderli non sia davvero il problema. Il problema è che avresti bisogno di gestire riferimenti circolari tra le due parti del progetto. Questo in sostanza significa che non puoi compilare facilmente nessuna delle due parti (che è arrivata prima, un uovo o un pollo?) –

+0

@Tomas - Ottimo punto. – KeithS

+1

@Tomas - Questo potrebbe essere risolto applicando l'ordinamento dei file, come fa F #. –

9

Mentre i progetti sono limitati a una sola lingua, una soluzione non è ... e le soluzioni possono contenere più progetti.

+0

MA utilizzando solo l'IDE è impossibile (credo) avere un singolo .EXE da più progetti. – xanatos

+3

Uno dei progetti sarebbe l'EXE e un altro sarebbe una DLL che si trova accanto ed è chiamata dall'EXE. – KeithS

+3

Oppure un progetto può produrre un .netmodule e l'altro progetto può consumare quel .netmodule nel suo assieme risultante in un singolo .exe. – ildjarn

5

Per quello che vale, è possibile avere progetti ASP.NET che utilizzano C# e VB.NET (o qualsiasi altra cosa, si definiscono i compilatori in web.config), solo in file diversi.

3

Tutti i file di codice vengono elaborati da un singolo compilatore. Ecco perché un progetto può contenere solo una singola lingua.

Le lingue di missaggio potrebbero non avere molto senso, dal momento che ogni lingua genera il proprio IL.

Questo, naturalmente, non limita si forma avere più progetti provenienti da diversi linguaggi nella stessa soluzione, dal momento che ogni progetto viene compilato in modo indipendente

2

Considerare l'utilizzo ILMerge se si vuole mantenere un singolo exe o dll built da un certo numero di compilatori diversi.

7

Come già menzionato, un progetto è un'unità indipendente compilata da un singolo compilatore.

Ho sentito la domanda sull'inserimento ad es. un tipo F # in un progetto C# più grande abbastanza spesso, quindi aggiungerò alcuni dettagli dal punto di vista specifico di F #. Ci sono alcuni problemi tecnici che renderebbero davvero difficile mescolare F # e C# in un progetto:

  • Il compilatore C# vede tutte le classi, mentre le dichiarazioni di tipo F # dipendono dall'ordine. Non sono sicuro di come vorresti anche specificare quali tipi dovrebbe vedere il codice F # a quel punto.
  • Il compilatore F # deve sapere come vengono utilizzate le dichiarazioni per inferire i tipi. Otterrebbe anche informazioni sull'utilizzo dal compilatore C#?
  • I due compilatori utilizzano una diversa rappresentazione dei tipi. Durante la compilazione, non ci sono informazioni System.Type, quindi come avrebbero condiviso le informazioni?(Entrambi dovrebbero concordare su un'interfaccia comune che consenta loro di includere informazioni specifiche della lingua - e le informazioni potrebbero anche essere incomplete).

Penso che questo sia sufficiente per spiegare che fare questo non è solo una funzione che può o non può essere fatta a seconda del programma. In realtà è un problema di ricerca interessante.

2

Tecnicamente, è possibile mescolare le lingue in un singolo progetto, se una (o più) di quelle lingue sono lingue di scripting. Vedi How to use Microsoft.Scripting.Hosting? per maggiori dettagli.

So che questo non è quello di cui stavi parlando, ma è un fatto divertente se non lo sapessi.

2

Il file di progetto non è altro che un elenco elevato di parametri della riga di comando per il compilatore pertinente. Un file con estensione .csproj contiene i parametri per un compilatore C#, .vbproj per il compilatore VB.NET e così via.

È tuttavia possibile creare due o più progetti nello stesso file di soluzione, uno per ogni lingua e quindi collegarli in un unico file exe utilizzando ILMerge.

Problemi correlati