Come si fa? È possibile chiamare una funzione da un codice F # a C# senza usare un file o un progetto dll separati?È possibile combinare file .cs (C#) e .fs (F #) in un singolo progetto di console di Windows di Visual Studio? (.NET)
risposta
Non è possibile includere due lingue diverse nello stesso progetto, ma è possibile unirle utilizzando ilmerge. Per fare ciò, inserisci entrambi i progetti nella stessa soluzione e fai riferimento al modulo F # come faresti con qualsiasi DLL. Come parte dello script di distribuzione, esegui ilmerge per combinare il file exe e il file dll in un unico file exe. Vedi questo articolo Code Project che spiega come usare ilmerge per creare un exe.
No. Se si desidera produrre un singolo exe, è possibile utilizzare alcune delle opzioni di collegamento statico f # utilizzando il comando F # --full-help comando di ulteriori dettagli.
Non essere in grado di mescolare C# e F # nello stesso progetto crea un problema; Porta a dipendenze circolari tra i due progetti. Concettualmente esiste un solo progetto che contiene due lingue, ma a causa del modo in cui lo studio visivo gestisce i progetti, le lingue non possono essere mescolate, portando a dipendenze circolari.
Per ora l'unica soluzione che vedo è creare molte interfacce in un terzo progetto e fare in modo che uno dei progetti si riferisca al progetto interfacce, anziché al progetto reale. C'è un modo migliore?
Cordiali saluti, Nick
Commenti e domande eccellenti, ma non riceverai molta attenzione a meno che tu non lo pubblichi come domanda. –
+1 Ho visto diversi progetti commerciali ricorrere all'utilizzo di ILMerge per ottenere C# e F # nello stesso assembly. Microsoft dovrebbe supportare correttamente ILMerge e incorporarlo in Visual Studio piuttosto che lasciare un dipendente a pubblicare il software di rilascio alfa. –
Non è possibile compilare i file # sorgente F (.fs) in un progetto C#, ma è possibile aggiungere file # di script F (.fsx), che si possono utilizzare per fare riferimento ed esplorare la montaggio C# del progetto da F # interattivo:
public static class Math
{
public static double PowN(double d, int n)
{
var result = 1;
for (int i = 0; i < n; i++) result *= d;
return result;
}
}
F # file di script (.fsx):
#r "bin\debug\ClassLibrary1.dll"
Math.PowN(2.0,3)
compilare il codice F #, "decompilare" con qualsiasi strumento (come riflettore, i lspy) al codice C#, includilo in un progetto -> Profitto!
L'interruttore di collegamento statico di F # è la stessa cosa di ilmerge. – Robert