Mischen von C # und VB im selben Projekt

145

Können Sie vb- und c # -Dateien im selben Projekt für eine Klassenbibliothek mischen? Gibt es eine Einstellung, die dies ermöglicht?

Ich habe es versucht und keiner der Intellisense funktioniert ganz richtig, obwohl der Hintergrund-Compiler gut genug damit umzugehen scheint (abgesehen von der Tatsache, dass ich damals zwei Klassen im selben Namespace mit demselben Namen hatte und mich nicht beschwerte).

Wir versuchen, von VB nach C # zu konvertieren, haben jedoch noch nicht den gesamten Code konvertiert. Ich habe neuen Code, den ich schreiben muss, wollte aber nicht wirklich ein neues Projekt nur dafür erstellen.

Wes P.
quelle
9
Warum schreiben Sie neuen Code in VB, wenn Sie gerade die Konvertierung in C # abgeschlossen haben?
Adam Robinson
Im Übrigen dachte ich, dass es möglich sein könnte, einen Hybridansatz mit Teilklassen in zwei verschiedenen Projekten durchzuführen, aber Teilbereiche können keine Baugruppen umfassen, sodass dies auch nicht funktioniert.
D. Lambert
Dang, das würde mein nächster Versuch sein.
Wes P
1
Mein Beitrag wurde korrigiert. Wir sind noch nicht fertig.
Wes P
10
Einer der Gründe für das Einmischen von VB-Code ist die Verwendung seiner einzigartigen Funktionen, insbesondere seiner XML-Funktionen, wenn Sie beispielsweise LINQ to XML verwenden. Auf diese Weise können Sie anstelle von 'from element in root.Elements ("Data")' die dynamische XML-Syntax von VB verwenden: 'From element In root. <Data>'. Wenn Sie viel mit XML-Dateien arbeiten, kann diese Syntax viel einfacher zu
handhaben sein

Antworten:

128

Nein, das kannst du nicht. Eine Assembly / ein Projekt (jedes Projekt wird normalerweise zu einer Assembly kompiliert) muss eine Sprache haben. Sie können jedoch mehrere Assemblys verwenden, und jede kann in einer anderen Sprache codiert werden, da alle in MSIL kompiliert sind.

Es wurde gut kompiliert und hat sich nicht beschwert, da ein VB.NET-Projekt nur die .vb-Dateien kompiliert und ein C # -Projekt nur die .cs-Dateien kompiliert. Die anderen wurden ignoriert, daher haben Sie keine Fehler erhalten.

Bearbeiten: Wenn Sie einem C # -Projekt eine .vb-Datei hinzufügen, die Datei im Projektmappen-Explorer auswählen und dann im Eigenschaftenfenster nachsehen, werden Sie feststellen, dass die Build-Aktion "Inhalt" und nicht "Kompilieren" ist. Es wird als einfache Textdatei behandelt und nicht einmal als binäre Ressource in die kompilierte Assembly eingebettet.

Bearbeiten: Bei asp.net-Websites können Sie der vb.net-Website eine C # -Webbenutzersteuerung hinzufügen

Joel B Fant
quelle
1
Es gibt Möglichkeiten, zwei Baugruppen nachträglich zu kombinieren, aber das würde das Problem dieses Benutzers nicht lösen.
Steven Sudit
Stimmt, aber ich würde es nicht nur zum Mischen von Sprachen dulden.
Joel B Fant
Ich glaube, Sie können verwaltetes und nicht verwaltetes C ++ im selben Projekt mischen.
Callum Rogers
@C Rogers: Diese Situation ist ein ganz anderes Tier. Sie können verwaltetes und nicht verwaltetes C ++ in derselben Quelldatei mischen, wenn Sie möchten. Aber es ist immer noch nicht dasselbe wie das Mischen von VB.NET und C #.
Joel B Fant
3
@ DanHoward: Autsch, brenne. Das ist definitiv ein Block, da es nicht möglich ist, Sprachen innerhalb desselben Projekts zu mischen und abzugleichen!
32

Eigentlich habe ich vor einigen Jahren ein Projekt von einem Kollegen geerbt, der beschlossen hatte, VB- und C # -Webformulare innerhalb desselben Projekts zu mischen. Das hat funktioniert, aber es macht keinen Spaß, es zu pflegen.

Ich entschied, dass neuer Code C # -Klassen sein sollte, und um sie zum Laufen zu bringen, musste ich dem Kompilierungsteil von web.config einen Unterknoten hinzufügen

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

Der gesamte VB-Code wird in einen Unterordner im App_Code mit dem Namen VB und der C # -Code in den CS-Unterordner verschoben. Dadurch werden zwei DLL-Dateien erstellt. Es funktioniert, aber der Code wird in derselben Reihenfolge kompiliert, wie er in "codeSubDirectories" aufgeführt ist. Daher sollten sich die Schnittstellen im VB-Ordner befinden, wenn sie sowohl in C # als auch in VB verwendet werden.

Ich habe sowohl einen Verweis auf einen VB- als auch einen C # -Compiler in

<system.codedom>
    <compilers>

Das Projekt wird derzeit auf Framework 3.5 aktualisiert und funktioniert immer noch (aber es macht immer noch keinen Spaß, es zu warten.)

Lars Seltsam
quelle
Siehe stackoverflow.com/questions/15711964/… für weitere Details
John
20

Sie können vb und c # nicht innerhalb desselben Projekts mischen. Wenn Sie in Visual Studio feststellen, dass die Projektdateien entweder .vbproj oder .csproj sind. Sie können innerhalb einer Lösung 1 proj in vb und 1 in c # haben.

Sieht so aus, als könnten Sie beide möglicherweise in einem Webprojekt im Verzeichnis App_Code verwenden:

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

brendan
quelle
3
Downvote, da die Projektdatei nicht der Grund ist, warum Sie daraus keine Assembly erstellen können. Mit dem Compiler über die Befehlszeile können Sie eine Assembly kompilieren, ohne dass jemals eine Projektdatei vorhanden war. Der Grund, warum es nicht funktioniert, ist, dass eine Assembly (fast immer) ein Kompilierungsjob von einem Compiler ist. Es hat nichts mit der Projektdatei zu tun.
Tom W
8
Upvote. Aus Sicht der Benutzer ist die Idee, dass die Erweiterung anders ist, das verräterische Zeichen, dass Sie nicht / können.
user4951
14

Möglicherweise ist dies mit einer benutzerdefinierten MSBuild-Entwicklung möglich. Die bereitgestellten .targets erzwingen, dass die Projekte einsprachig sind - dies wird jedoch durch keine Laufzeit- oder Tooling-Einschränkung verhindert.

Sowohl der VB- als auch der CS-Compiler können in Module ausgeben - die CLR-Version von OBJ-Dateien. Mit dem Assembly-Linker können Sie die Module aus dem VB- und CS-Code entnehmen und eine einzelne Assembly erstellen.

Nicht, dass dies eine triviale Anstrengung wäre, aber es würde wahrscheinlich funktionieren.

Scott Weinstein
quelle
6
Es gibt eine gute Zuschreibung auf dem von Thomas Freudenberg hier .
Dave M
1
Ein weiteres Beispiel finden Sie in Beispiel: Mischen von nicht verwaltetem C ++ -, C ++ / CLI- und C # -Code von Junfeng Zhang. Es könnte funktionieren, nachdem es zum ersten Mal ausgeführt wurde. \ VC \ bin \ vcvars32.bat aus meiner Visual Studio-Installation. Das Mischen verschiedener Sprachen ist eigentlich eine Baugruppe und nicht in einem Projekt.
R. Schreurs
7

Exemplarische Vorgehensweise: Verwenden mehrerer Programmiersprachen in einem Website-Projekt http://msdn.microsoft.com/en-us/library/ms366714.aspx

Standardmäßig erlaubt der App_Code-Ordner nicht mehrere Programmiersprachen. In einem Website-Projekt können Sie jedoch Ihre Ordnerstruktur und Konfigurationseinstellungen ändern, um mehrere Programmiersprachen wie Visual Basic und C # zu unterstützen . Auf diese Weise kann ASP.NET mehrere Assemblys erstellen, eine für jede Sprache. Weitere Informationen finden Sie unter Freigegebene Codeordner in ASP.NET-Webprojekten. Entwickler fügen normalerweise mehrere Programmiersprachen in Webanwendungen ein, um mehrere Entwicklungsteams zu unterstützen, die unabhängig voneinander arbeiten und unterschiedliche Programmiersprachen bevorzugen.

gerryLowry
quelle
2

Obwohl Visual Studio dies nicht unterstützt (Sie können einige Tricks ausführen und MSBuild veranlassen, beide zu kompilieren, jedoch nicht aus Visual Studio heraus), tut SharpDevelop dies. Sie können beide in derselben Lösung haben (solange Sie Visual Studio Professional und höher ausführen). Die einfachste Lösung, wenn Sie Visual Studio weiterhin verwenden möchten, besteht darin, Ihren VB-Code in ein anderes Projekt zu trennen und auf diese Weise darauf zuzugreifen.

Kris Erickson
quelle
1
Wie unterstützt ShartDevelop dies? Ich habe es gerade versucht und es wird nicht kompiliert. Gibt es etwas Besonderes, das getan werden muss?
Epitka
2

Klicken Sie mit der rechten Maustaste auf das Projekt. Wählen Sie Add Asp.Net Folder. Erstellen Sie unter Der Ordner zwei Ordner mit dem Namen VBCodeFiles und den anderen CSCodeFiles. Fügen Sie in Web.Config ein neues Element hinzu, das kompiliert werden soll

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

Erstellen Sie nun eine cshtml-Seite. Fügen Sie mithilfe von einen Verweis auf VBCodeFiles.Namespace.MyClassName hinzu

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

Wobei MyClassName ein Klassenobjekt ist, das im obigen Namespace gefunden wird. Schreiben Sie nun das Objekt mit einer cshtml-Datei in Rasiermesser.

<p>@Model.FirstName</p>

Beachten Sie, dass directoryName = "CSCodeFiles" redundant ist, wenn es sich um ein C # -Projekt handelt, und directoryName = "VBCodeFiles" redundant ist, wenn es sich um ein VB.Net-Projekt handelt.

RickIsWright
quelle
2

Ja, es ist möglich, c # - und vb.net-Projekte zu einer einzigen Lösung hinzuzufügen.

Schritt 1: Datei-> Hinzufügen-> Vorhandenes Projekt

Schritt 2: Projekt-> Referenz hinzufügen-> DLL oder Exe des Projekts, das Sie zuvor hinzugefügt haben.

Schritt 3: In vb.net Form, wo Sie c # Formulare verwenden möchten -> Namespace des Projekts importieren.

user6808128
quelle
1

Ich sehe nicht ein, wie Sie ein Projekt mit dem C # -Compiler (oder dem VB-Compiler) kompilieren können, ohne dass die falsche Sprache für den Compiler verwendet wird.

Bewahren Sie Ihren C # -Code in einem von Ihrem VB-Projekt getrennten Projekt auf. Sie können diese Projekte in dieselbe Lösung aufnehmen.

Zügel
quelle
1

Sie benötigen ein Projekt pro Sprache. Ich bin mir ziemlich sicher, dass ich ein Tool gesehen habe, mit dem Baugruppen zusammengeführt wurden. Wenn Sie dieses Tool finden, sollten Sie bereit sein. Wenn Sie beide Sprachen in derselben Klasse verwenden müssen, sollten Sie in der Lage sein, die Hälfte davon in beispielsweise VB.net zu schreiben und den Rest in C # zu schreiben, indem Sie die VB.net-Klasse erben.

svinto
quelle
1

Nein, Sie können sie nicht im selben Projekt mischen, da die Gefahr besteht, dass jede andere Antwort wiederholt wird.

Abgesehen davon, wenn Sie gerade die Konvertierung von VB in C # abgeschlossen haben, warum sollten Sie dann neuen Code in VB schreiben?

Adam Robinson
quelle
2
Weil du in meinem Beitrag einen Fehler gefunden hast :) Wir haben die Konvertierung noch nicht abgeschlossen.
Wes P
1

Für .net 2.0 funktioniert dies. Es kompiliert beide im selben Projekt, wenn Sie Unterverzeichnisse im App-Code mit dem zugehörigen Sprachcode erstellen. Bis jetzt bin ich auf der Suche, ob dies in 3.5 funktionieren soll oder nicht.

mgbiere
quelle
1

Warum kompilieren Sie Ihren VBCode nicht einfach in eine Bibliothek ( .dll). Referenzieren Sie ihn später aus Ihrem Code und fertig. Verwaltete dllsenthalten, MSILzu denen beide c#und vbkompiliert werden.

Ajov
quelle
2
Sie werden vollgestopft sein, wenn Sie jemals auf einen Ihrer neuen C # -Codes aus dem alten VB.NET-Code verweisen müssen. Oder umgekehrt, egal in welche Richtung Sie gehen, es handelt sich nur um Einwegreferenzen.
Roman Starkov
0

Wie andere gesagt haben, können Sie nicht beide in einem Projekt zusammenfassen. Wenn Sie jedoch nur ein kleines Stück C # - oder VB-Code haben, das Sie in einem Projekt in einer anderen Sprache einfügen möchten, gibt es automatische Konvertierungstools . Sie sind nicht perfekt, aber sie machen die meisten Dinge ziemlich gut. In SharpDevelop ist außerdem ein Konvertierungsdienstprogramm integriert.

Scott Whitlock
quelle
Da ist das. Ich könnte es einfach aufsaugen und codieren, was ich in VB brauche, und es später mit dem Rest des Materials konvertieren.
Wes P
0

Nein, nicht im selben Projekt. Sie können sie jedoch in derselben Lösung verwenden. Sie müssen jedoch darauf achten, dass Ihr Code CLS-kompatibel ist. Das bedeutet, dass Sie keine Funktionen / Features verwendet haben dürfen, die von einer anderen Sprache nicht verstanden werden. Zum Beispiel versteht VB keine vorzeichenlosen Ints.

juhi
quelle
0

In unserem Szenario handelt es sich um ein einzelnes VB.NET-Projekt (Windows Desktop-Anwendung) in einer einzelnen Lösung. Wir wollten jedoch C # -Funktionen wie vorzeichenbehaftete / vorzeichenlose Ganzzahlen und XML-Literale sowie Zeichenfolgenfunktionen in VB.NET nutzen. Abhängig von den Funktionen erstellen wir zur Laufzeit die Codedatei, kompilieren sie mit dem entsprechenden Rosalyn-Compiler (VB / CS) in die DLL und laden sie dynamisch in die aktuelle Assembly. Natürlich mussten wir daran arbeiten, die dynamischen DLLs zu entkoppeln, zu entladen, neu zu laden, zu benennen usw., und die Speicherverwaltung, bei der wir größtenteils dynamische GUID für die Benennung verwendeten, um Konflikte zu vermeiden. Es funktioniert einwandfrei, wenn App-Benutzer von unserer Desktop-App aus eine Verbindung zu einer beliebigen Datenbank herstellen, eine SQL-Abfrage schreiben, die Verbindung in eine LINQ-Verbindung konvertieren und auch LINQ-Abfragen schreiben können, was alles das dynamische Erstellen von Quellcode, das Kompilieren in DLL und das Anhängen an die aktuelle Assembly erfordert.

Venkat
quelle
-1

Ja, Sie können beide Dateien nur auf der Website hinzufügen. Wenn es sich bei dem Projekt um eine Webanwendung handelt, sind keine anderen Dateitypen zulässig.

Python
quelle