Mélanger C # et VB dans le même projet

145

Pouvez-vous mélanger des fichiers vb et c # dans le même projet pour une bibliothèque de classes? Y a-t-il un paramètre qui le rend possible?

J'ai essayé et aucun des intellisense ne fonctionne tout à fait correctement, bien que le compilateur d'arrière-plan semble le gérer assez bien (mis à part le fait que j'avais alors 2 classes dans le même espace de noms avec le même nom et il ne s'est pas plaint).

Nous essayons de convertir de VB en C # mais n'avons pas fini de convertir tout le code. J'ai du nouveau code à écrire, mais je ne voulais pas vraiment créer un nouveau projet juste pour ça.

Wes P
la source
9
Pourquoi écrivez-vous un nouveau code en VB si vous venez de terminer la conversion en C #?
Adam Robinson
Incidemment, je pensais qu'il serait possible de tirer une approche hybride en utilisant des classes partielles dans deux projets différents, mais les partiels ne peuvent pas couvrir les assemblages, donc cela ne fonctionnera pas non plus.
D. Lambert
Dang, ça allait être ma prochaine tentative.
Wes P
1
Correction de mon message. Nous n'avons pas fini.
Wes P
10
l'une des raisons pour lesquelles le code VB est mélangé est d'utiliser ses fonctionnalités uniques, notamment ses capacités XML si vous utilisez LINQ to XML par exemple. De cette façon, au lieu d'écrire 'from element in root.Elements ("Data")', vous pouvez utiliser la syntaxe XML dynamique de VB: 'From element In root. <Data>'. Lorsque vous travaillez beaucoup avec des fichiers XML, cette syntaxe peut être beaucoup plus facile à utiliser que celle de C #
Marchy

Réponses:

129

Non, tu ne peux pas. Un assemblage / projet (chaque projet se compile en 1 assemblage généralement) doit être un langage. Cependant, vous pouvez utiliser plusieurs assemblys, et chacun peut être codé dans un langage différent car ils sont tous compilés vers MSIL.

Il s'est bien compilé et ne s'est pas plaint car un projet VB.NET ne compilera en fait que les fichiers .vb et un projet C # ne compilera réellement que les fichiers .cs. Il ignorait les autres, donc vous n'avez pas reçu d'erreurs.

Modifier: Si vous ajoutez un fichier .vb à un projet C #, sélectionnez le fichier dans le panneau Explorateur de solutions, puis regardez le panneau Propriétés, vous remarquerez que l'action de génération est «Contenu», pas «Compiler». Il est traité comme un simple fichier texte et n'est même pas incorporé dans l'assembly compilé en tant que ressource binaire.

Edit: Avec les sites Web asp.net, vous pouvez ajouter un contrôle utilisateur Web c # au site Web vb.net

Joël B Fant
la source
1
Il existe des moyens de combiner deux assemblages après coup, mais cela ne résoudrait pas le problème de cet utilisateur.
Steven Sudit
C'est vrai, mais je ne l'approuverais pas dans le seul but de mélanger les langues.
Joel B Fant
Je crois que vous pouvez mélanger du C ++ géré et non géré dans le même projet.
Callum Rogers
@C Rogers: Cette situation est totalement différente. Vous pouvez mélanger du C ++ managé et non managé dans le même fichier source si vous le souhaitez. Mais ce n'est toujours pas la même chose que de mélanger VB.NET et C #.
Joel B Fant
4
@DanHoward: Aïe, brûle. C'est définitivement un blocage là-bas, ne pas pouvoir mélanger et assortir les langues dans le même projet!
32

Eh bien, en fait, j'ai hérité d'un projet il y a quelques années d'un collègue qui avait décidé de mélanger les formulaires Web VB et C # dans le même projet. Cela a fonctionné mais est loin d'être amusant à entretenir.

J'ai décidé que le nouveau code devrait être des classes C # et pour les faire fonctionner, j'ai dû ajouter un sous-nœud à la partie compilation de web.config

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

Le code tout VB va dans un sous-dossier dans App_Code appelé VB et le code C # dans le sous-dossier CS. Cela produira deux fichiers .dll. Cela fonctionne, mais le code est compilé dans le même ordre que celui indiqué dans "codeSubDirectories" et par conséquent, les interfaces doivent être dans le dossier VB si elles sont utilisées à la fois en C # et en VB.

J'ai à la fois une référence à un VB et un compilateur C # dans

<system.codedom>
    <compilers>

Le projet est actuellement mis à jour vers le framework 3.5 et il fonctionne toujours (mais toujours pas amusant à maintenir ..)

Lars étrange
la source
Voir stackoverflow.com/questions/15711964/… pour plus de détails
Jean
20

Vous ne pouvez pas mélanger vb et c # dans le même projet - si vous remarquez dans Visual Studio, les fichiers du projet sont .vbproj ou .csproj. Vous pouvez dans une solution - avoir 1 proj en vb et 1 en c #.

On dirait qu'en fonction de cela, vous pouvez potentiellement les utiliser tous les deux dans un projet Web dans le répertoire App_Code:

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

Brendan
la source
3
Downvote car le fichier Project n'est pas la raison pour laquelle vous ne pouvez pas produire d'assemblage à partir d'eux. Vous pouvez compiler un assembly sans qu'un fichier Project ait jamais existé si vous le souhaitez, en utilisant le compilateur à partir de la ligne de commande. La raison pour laquelle cela ne fonctionnera pas est qu'un assembly est (presque toujours) un travail de compilation d'un compilateur. Cela n'a rien à voir avec le fichier de projet.
Tom W
8
Vote positif. Du point de vue des utilisateurs, l'idée que l'extension est différente est le signe révélateur que vous ne pouvez pas /.
user4951
14

Cela pourrait être possible avec un développement MSBuild personnalisé. Les .targets fournis forcent les projets à être dans un seul langage - mais aucune restriction d'exécution ou d'outillage ne l'empêche.

Les compilateurs VB et CS peuvent générer des sorties vers des modules - la version CLR des fichiers .obj. À l'aide de l'éditeur de liens d'assembly, vous pouvez prendre les modules du code VB et CS et produire un seul assembly.

Non pas que ce serait un effort trival, mais cela fonctionnerait probablement.

Scott Weinstein
la source
6
Il y a un bon article à ce sujet par Thomas Freudenberg ici .
Dave M
1
Un autre exemple de peut être trouvé dans Sample: Mixing Unmanaged C ++, C ++ / CLI, and C # code by Junfeng Zhang's. Il pourrait le faire fonctionner après la première exécution. \ VC \ bin \ vcvars32.bat à partir de mon installation Visual Studio. Il s'agit en fait de mélanger différents langages dans un seul assemblage plutôt que dans un seul projet.
R. Schreurs
7

Procédure pas à pas: utilisation de plusieurs langages de programmation dans un projet de site Web http://msdn.microsoft.com/en-us/library/ms366714.aspx

Par défaut, le dossier App_Code n'autorise pas plusieurs langages de programmation. cependant, dans un projet de site Web, vous pouvez modifier votre structure de dossiers et vos paramètres de configuration pour prendre en charge plusieurs langages de programmation tels que Visual Basic et C # . Cela permet à ASP.NET de créer plusieurs assemblys, un pour chaque langue. Pour plus d'informations, consultez Dossiers de code partagés dans les projets Web ASP.NET. Les développeurs incluent généralement plusieurs langages de programmation dans les applications Web pour prendre en charge plusieurs équipes de développement qui fonctionnent indépendamment et préfèrent différents langages de programmation.

gerryLowry
la source
2

Bien que Visual Studio ne prenne pas en charge cela (vous pouvez faire quelques astuces et demander à MSBuild de compiler les deux, mais pas à partir de Visual Studio), SharpDevelop le fait. Vous pouvez avoir les deux dans la même solution (tant que vous exécutez Visual Studio Professional et supérieur), donc la solution la plus simple si vous souhaitez continuer à utiliser Visual Studio est de séparer votre code VB dans un projet différent et d'y accéder de cette manière.

Kris Erickson
la source
1
Comment ShartDevelop prend-il en charge cela? Je viens de l'essayer et ça ne compile pas. Y a-t-il quelque chose de spécial à faire?
epitka
2

Cliquez avec le bouton droit sur le projet. Choisissez Ajouter un dossier Asp.Net. Sous le dossier, créez deux dossiers, l'un nommé VBCodeFiles et l'autre CSCodeFiles dans Web.Config, ajoutez un nouvel élément sous compilation

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

Maintenant, créez une page cshtml. Ajoutez une référence à VBCodeFiles.Namespace.MyClassName en utilisant

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

Où MyClassName est un objet de classe trouvé dans l'espace de noms ci-dessus. écrivez maintenant l'objet dans rasoir en utilisant un fichier cshtml.

<p>@Model.FirstName</p>

Veuillez noter que le directoryName = "CSCodeFiles" est redondant s'il s'agit d'un projet C # et le directoryName = "VBCodeFiles" est redondant s'il s'agit d'un projet VB.Net.

RickIsWright
la source
2

Oui, il est possible d'ajouter des projets c # et vb.net en une seule solution.

Étape 1: Fichier-> Ajouter-> Projet existant

Étape 2: Projet-> Ajouter une référence-> dll ou exe du projet que vous avez ajouté auparavant.

step3: sous la forme vb.net où vous voulez utiliser c # forms-> importer l'espace de noms du projet.

user6808128
la source
1

Je ne vois pas comment vous pouvez compiler un projet avec le compilateur C # (ou le compilateur VB) et ne pas le faire hésiter au mauvais langage pour le compilateur.

Conservez votre code C # dans un projet distinct de votre projet VB. Vous pouvez inclure ces projets dans la même solution.

rêne
la source
1

Vous avez besoin d'un projet par langue. Je suis assez confiant d'avoir vu un outil qui a fusionné des assemblages, si vous trouvez cet outil, vous devriez être prêt à partir. Si vous avez besoin d'utiliser les deux langages dans la même classe, vous devriez pouvoir en écrire la moitié dans, disons VB.net, puis écrire le reste en C # en héritant de la classe VB.net.

svinto
la source
1

Au risque de faire écho à toutes les autres réponses, non, vous ne pouvez pas les mélanger dans le même projet.

Cela mis à part, si vous venez de terminer la conversion de VB en C #, pourquoi écririez-vous un nouveau code en VB?

Adam Robinson
la source
2
Parce que vous avez trouvé une erreur dans mon message :) Nous n'avons pas encore terminé la conversion.
Wes P
1

Pour .net 2.0, cela fonctionne. Il compile les deux dans le même projet si vous créez des sous-répertoires de code d'application avec le code de langue associé. Pour l'instant, je cherche à savoir si cela devrait fonctionner en 3.5 ou non.

mgbières
la source
1

Pourquoi ne pas simplement compiler votre VBcode dans une bibliothèque ( .dll) .Référer plus tard à partir de votre code et c'est tout. Managed dllscontient MSILdans lequel les deux c#et vbsont compilés.

Ajov
la source
2
Vous serez complètement bourré si jamais vous avez besoin de référencer l'un de vos nouveaux codes C # à partir du code VB.NET hérité. Ou vice versa, quelle que soit votre voie, ce ne sont que des références à sens unique.
Roman Starkov
0

Comme d'autres l'ont dit, vous ne pouvez pas mettre les deux dans un même projet. Cependant, si vous ne disposez que d'un petit morceau de code C # ou VB que vous souhaitez inclure dans un projet dans l'autre langue, il existe des outils de conversion automatique . Ils ne sont pas parfaits, mais ils font assez bien la plupart des choses. En outre, SharpDevelop a un utilitaire de conversion intégré.

Scott Whitlock
la source
Il y a ça. Je pourrais juste l'aspirer et coder ce dont j'ai besoin en VB et le convertir plus tard avec le reste du matériel.
Wes P
0

Non, pas dans le même projet, mais vous pouvez les utiliser dans la même solution. mais vous devez vous assurer que votre code est conforme CLS. Cela signifie que vous ne devez pas avoir utilisé une telle fonctionnalité / fonctionnalité qui n'est pas comprise par une autre langue. Par exemple, VB ne comprend pas les entiers non signés.

juhi
la source
0

Dans notre scénario, il s'agit d'un seul projet VB.NET (application Windows Desktop) dans une seule solution. Cependant, nous voulions tirer parti des fonctionnalités C # telles que les entiers signés / non signés et les littéraux XML et les fonctionnalités de chaîne dans VB.NET. Ainsi, en fonction des fonctionnalités, au moment de l'exécution, nous construisons le fichier de code, compilons à l'aide du compilateur Rosalyn respectif (VB / CS) dans la DLL et chargeons dynamiquement dans l'assemblage actuel. Bien sûr, nous avons dû travailler sur la dissociation, le déchargement, le rechargement, la dénomination, etc. des DLL dynamiques et la gestion de la mémoire où nous utilisions largement le GUID dynamique pour la dénomination afin d'éviter les conflits. Cela fonctionne bien lorsque l'utilisateur de l'application peut se connecter à n'importe quelle base de données à partir de notre application de bureau, écrire une requête SQL, convertir la connexion en connexion LINQ et écrire également des requêtes LINQ, ce qui nécessite la construction dynamique du code source, la compilation en DLL et l'attachement à l'assembly actuel.

Venkat
la source
-1

Oui, vous pouvez ajouter les deux fichiers dans le site Web uniquement.Si le projet est une application Web, il n'autorisera pas différents types de fichiers.

Python
la source