Miscelazione di C # e VB nello stesso progetto


145

Puoi mescolare file vb e c # nello stesso progetto per una libreria di classi? C'è qualche impostazione che lo rende possibile?

Ho provato e nessuno degli intellisense funziona abbastanza bene, anche se il compilatore in background sembra gestirlo abbastanza bene (a parte il fatto che io, allora, avevo 2 classi nello stesso spazio dei nomi con lo stesso nome e non si è lamentato).

Stiamo provando a convertire da VB a C # ma non abbiamo finito di convertire tutto il codice. Ho del nuovo codice che devo scrivere, ma non volevo davvero fare un nuovo progetto solo per questo.


9
Perché stai scrivendo un nuovo codice in VB se hai appena finito di convertire in C #?
Adam Robinson,

Per inciso, ho pensato che sarebbe stato possibile realizzare un approccio ibrido usando classi parziali in due diversi progetti, ma i parziali non possono estendersi agli assiemi, quindi neanche questo funzionerà.
D. Lambert,

Dang, quello sarebbe stato il mio prossimo tentativo.
Wes P,

1
Risolto il mio post. Non abbiamo finito.
Wes P,

10
uno dei motivi per cui il codice VB è mischiato è usare le sue caratteristiche uniche, in particolare le sue capacità XML, ad esempio se si utilizza LINQ to XML. In questo modo invece di scrivere 'dall'elemento in root.Elements ("Dati")' potresti usare la sintassi XML dinamica di VB: 'Dall'elemento in root. <Dati>'. Quando si lavora molto con file XML, questa sintassi può essere molto più semplice da utilizzare rispetto a C #
Marchy

Risposte:


129

No, non puoi. Un assembly / progetto (ogni progetto viene compilato in 1 assembly in genere) deve essere una lingua. Tuttavia, è possibile utilizzare più assembly e ognuno può essere codificato in una lingua diversa perché sono tutti compilati in MSIL.

Ha compilato correttamente e non si è lamentato perché un progetto VB.NET compilerà effettivamente solo i file .vb e un progetto C # compilerà effettivamente solo i file .cs. Stava ignorando gli altri, quindi non hai ricevuto errori.

Modifica: se aggiungi un file .vb a un progetto C #, seleziona il file nel pannello Esplora soluzioni e poi osserva il pannello Proprietà, noterai che l'azione di compilazione è "Contenuto", non "Compila". Viene trattato come un semplice file di testo e non viene nemmeno incorporato nell'assieme compilato come risorsa binaria.

Modifica: con i siti Web asp.net è possibile aggiungere il controllo utente web c # al sito Web vb.net


1
Esistono modi per combinare due assiemi dopo il fatto, ma ciò non risolverebbe il problema di questo utente.
Steven Sudit,

È vero, ma non lo perdonerei al solo scopo di mescolare le lingue.
Joel B Fant,

Credo che tu possa mescolare c ++ gestito e non gestito nello stesso progetto.
Callum Rogers,

@C Rogers: questa situazione è completamente diversa. Se lo desideri, puoi combinare C ++ gestito e non gestito nello stesso file di origine. Ma non è ancora lo stesso del mixare VB.NET e C #.
Joel B Fant,

4
@DanHoward: Ouch, brucia. Questo è sicuramente un blocco lì, non essere in grado di mescolare e abbinare le lingue all'interno dello stesso progetto!

32

Bene, in realtà ho ereditato un progetto alcuni anni fa da un collega che aveva deciso di mescolare i moduli web VB e C # all'interno dello stesso progetto. Ha funzionato ma è tutt'altro che divertente da mantenere.

Ho deciso che il nuovo codice dovrebbe essere classi C # e per farli funzionare ho dovuto aggiungere un nodo secondario alla parte della compilazione di web.config

        <codeSubDirectories>
            <add directoryName="VB"/>
            <add directoryName="CS"/>
        </codeSubDirectories>

Tutto il codice VB viene inserito in una sottocartella in App_Code chiamato VB e il codice C # nella sottocartella CS. Ciò produrrà due file DLL. Funziona, ma il codice viene compilato nello stesso ordine elencato in "codeSubDirectories" e quindi le interfacce dovrebbero essere nella cartella VB se usate sia in C # che in VB.

Ho sia un riferimento a un compilatore VB che C # in

<system.codedom>
    <compilers>

Il progetto è attualmente aggiornato al framework 3.5 e funziona ancora (ma non è ancora divertente da mantenere ..)


Vedi stackoverflow.com/questions/15711964/… per maggiori dettagli
John

20

Non puoi mescolare vb e c # all'interno dello stesso progetto - se noti in Visual Studio i file del progetto sono .vbproj o .csproj. All'interno di una soluzione puoi avere 1 proj in vb e 1 in c #.

Sembra che in base a ciò puoi potenzialmente usarli entrambi in un progetto Web nella directory App_Code:

http://pietschsoft.com/post/2006/03/30/ASPNET-20-Use-VBNET-and-C-within-the-App_Code-folder.aspx


3
Downvote perché il file Project non è il motivo per cui non è possibile produrre un assembly da essi. È possibile compilare un assembly senza che sia mai esistito un file di progetto, se lo si desidera, utilizzando il compilatore dalla riga di comando. Il motivo per cui non funzionerà è che un assembly è (quasi sempre) un processo di compilazione da un compilatore. Non ha nulla a che fare con il file di progetto.
Tom W,

8
Upvote. Dal punto di vista degli utenti, l'idea che l'estensione sia diversa è il segno rivelatore che non puoi /.
user4951

14

Potrebbe essere possibile con alcuni sviluppi personalizzati di MSBuild. I .target forniti obbligano i progetti ad essere in una sola lingua, ma non ci sono restrizioni di runtime o strumenti che lo impediscono.

Entrambi i compilatori VB e CS possono essere inviati ai moduli : la versione CLR dei file .obj. Usando il linker assembly, è possibile prendere i moduli dal codice VB e CS e produrre un singolo assembly.

Non che questo sarebbe uno sforzo trivalente, ma probabilmente funzionerebbe.


6
C'è un buon resoconto su questo di Thomas Freudenberg qui .
Dave M,

1
Un altro esempio di può essere trovato nell'esempio : miscelazione di codice C ++, C ++ / CLI e C # non gestito di Junfeng Zhang. Potrebbe farlo funzionare dopo la prima esecuzione. \ VC \ bin \ vcvars32.bat dalla mia installazione di Visual Studio. Questo in realtà sta mescolando lingue diverse in un unico assemblaggio piuttosto che in un unico progetto.
R. Schreurs,

7

Scenario: utilizzo di più linguaggi di programmazione in un progetto di sito Web http://msdn.microsoft.com/en-us/library/ms366714.aspx

Per impostazione predefinita, la cartella App_Code non consente più linguaggi di programmazione. Tuttavia, in un progetto di sito Web è possibile modificare la struttura delle cartelle e le impostazioni di configurazione per supportare più linguaggi di programmazione come Visual Basic e C # . Ciò consente ad ASP.NET di creare più assembly, uno per ogni lingua. Per ulteriori informazioni, vedere Cartelle di codice condivise in Progetti Web ASP.NET. Gli sviluppatori includono comunemente più linguaggi di programmazione nelle applicazioni Web per supportare più team di sviluppo che operano in modo indipendente e preferiscono linguaggi di programmazione diversi.


2

Sebbene Visual Studio non lo supporti (puoi fare alcuni trucchi e far compilare entrambi MSBuild, ma non da Visual Studio), SharpDevelop lo fa. Puoi avere entrambi nella stessa soluzione (purché tu stia eseguendo Visual Studio Professional e versioni successive), quindi la soluzione più semplice se vuoi continuare a usare Visual Studio è quella di separare il tuo codice VB in un progetto diverso e accedervi in ​​quel modo.


1
In che modo ShartDevelop supporta questo? L'ho appena provato e non si compila. C'è qualcosa di speciale che deve essere fatto?
epitka,

2

Fare clic con il tasto destro del mouse sul Progetto. Scegli Aggiungi cartella Asp.Net. Sotto La cartella, crea due cartelle una denominata VBCodeFiles e l'altra CSCodeFiles In Web.Config aggiungi un nuovo elemento in fase di compilazione

<compilation debug="true" targetFramework="4.5.1">
      <codeSubDirectories>
        <add directoryName="VBCodeFiles"/>
        <add directoryName="CSCodeFiles"/>
      </codeSubDirectories>
</compilation>

Ora, crea una pagina cshtml. Aggiungere un riferimento a VBCodeFiles.Namespace.MyClassName utilizzando

@using DMH.VBCodeFiles.Utils.RCMHD
@model MyClassname

Dove MyClassName è un oggetto di classe trovato nello spazio dei nomi sopra. ora scrivi l'oggetto nel rasoio usando un file cshtml.

<p>@Model.FirstName</p>

Nota: directoryName = "CSCodeFiles" è ridondante se si tratta di un progetto C # e directoryName = "VBCodeFiles" è ridondante se si tratta di un progetto VB.Net.


2

Sì, è possibile. Aggiunta di progetti c # e vb.net in un'unica soluzione.

step1: File-> Aggiungi-> Progetto esistente

Step2: Progetto-> Aggiungi riferimento-> dll o exe del progetto che hai aggiunto in precedenza.

step3: Nel modulo vb.net dove vuoi usare c # form-> importa lo spazio dei nomi del progetto.


1

Non vedo come è possibile compilare un progetto con il compilatore C # (o il compilatore VB) e non farlo balk nella lingua sbagliata per il compilatore.

Conserva il tuo codice C # in un progetto separato dal tuo progetto VB. È possibile includere questi progetti nella stessa soluzione.


1

Hai bisogno di un progetto per lingua. Sono abbastanza sicuro di aver visto uno strumento che univa gli assiemi, se lo trovi dovresti essere pronto. Se devi usare entrambe le lingue nella stessa classe, dovresti essere in grado di scriverne metà in VB.net e poi scrivere il resto in C # ereditando la classe VB.net.


1

A rischio di echeggiare ogni altra risposta, no, non puoi mescolarle nello stesso progetto.

A parte questo, se hai appena finito di convertire VB in C #, perché dovresti scrivere un nuovo codice in VB?


2
Perché hai trovato un errore nel mio post :) Non abbiamo ancora finito di convertire.
Wes P,

1

Per .net 2.0 funziona. COMPILA entrambi nello stesso progetto se crei sottodirectory del codice in app con il codice lingua correlato. Per ora, sto cercando se questo dovrebbe funzionare in 3.5 o meno però.


1

Perché non compili semplicemente il tuo VBcodice in una libreria ( .dll). Fai riferimento in un secondo momento al tuo codice e basta. Managed dllscontiene MSILin cui entrambi c#e vbvengono compilati.


2
Sarai completamente riempito se dovessi mai fare riferimento a uno dei tuoi nuovi codici C # dal codice VB.NET legacy. O viceversa, qualunque sia la tua strada, sono solo riferimenti a senso unico.
Roman Starkov

0

Come altri hanno già detto, non è possibile inserire entrambi in un progetto. Tuttavia, se hai solo una piccola parte di codice C # o VB che desideri includere in un progetto in un'altra lingua, esistono strumenti di conversione automatica . Non sono perfetti, ma fanno abbastanza bene le cose. Inoltre, SharpDevelop ha un'utilità di conversione integrata.


C'è quello. Potrei semplicemente succhiarlo e codificare ciò di cui ho bisogno in VB e convertirlo in seguito con il resto delle cose.
Wes P,

0

No, non nello stesso progetto, ma puoi usarli nella stessa soluzione. anche se è necessario assicurarsi che il codice sia conforme a CLS. Ciò significa che non è necessario aver utilizzato tale funzionalità / caratteristica che non è compresa da altre lingue. Ad esempio VB non comprende gli integri non firmati.


0

Nel nostro scenario, si tratta di un singolo progetto VB.NET (applicazione desktop di Windows) in un'unica soluzione. Tuttavia, volevamo sfruttare le funzionalità di C # come numeri interi con segno / non firmato, valori letterali XML e funzionalità di stringa in VB.NET. Quindi, a seconda delle caratteristiche, in fase di esecuzione costruiamo il file di codice, compiliamo usando il rispettivo compilatore Rosalyn (VB / CS) in DLL e cariciamo dinamicamente nell'assembly corrente. Ovviamente abbiamo dovuto lavorare su delinking, scaricamento, ricaricamento, denominazione, ecc. Delle DLL dinamiche e gestione della memoria, dove abbiamo ampiamente utilizzato il GUID dinamico per nominare per evitare conflitti. Funziona perfettamente laddove l'utente dell'app possa connettersi a qualsiasi DB dalla nostra app desktop, scrivere query SQL, convertire la connessione in connessione LINQ e scrivere anche query LINQ che richiedono tutti la creazione dinamica del codice sorgente, la compilazione in DLL e il collegamento all'assembly corrente.


-1

Sì, è possibile aggiungere entrambi i file solo nel sito Web. Se il progetto è un'applicazione Web, non consentirà un diverso tipo di file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.