web-dev-qa-db-fra.com

Mélanger C # & VB Dans le même projet

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

J'ai essayé et aucun des intellisense ne fonctionne assez bien, 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 qu'elle ne se plaignait pas). 

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

135
Wes P

Non, tu ne peux pas. Une assemblée/un projet (chaque projet est compilé en une assemblée) doit être une seule langue. Toutefois, vous pouvez utiliser plusieurs assemblys et chacun d'entre eux peut être codé dans un langage différent car ils sont tous compilés pour MSIL.

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

Édition: Si vous ajoutez un fichier .vb à un projet C #, sélectionnez-le dans le panneau Explorateur de solutions, puis examinez 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’Assemblée compilée en tant que ressource binaire.

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

121
Joel B Fant

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

J'ai décidé que le nouveau code devait être des classes C # et pour les faire fonctionner, je devais ajouter un sous-noeud à la partie compilation de web.config.

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

Le code tout VB est placé dans un sous-dossier du code 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 se trouver dans le dossier VB si elles sont utilisées 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 ..)

32
Lars Strange

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

Cela ressemble à 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

20
brendan

Cela pourrait être possible avec certains développements MSBuild personnalisés. Les .targets fournis forcent les projets à utiliser une seule langue - mais aucune restriction d’exécution ou d’outils ne l’empêche. 

Les compilateurs VB et CS peuvent tous les deux exporter vers modules - la version CLR des fichiers .obj. En utilisant l'éditeur de liens Assembly, vous pouvez extraire les modules du code VB et du code CS et produire un seul assembly.

Non pas que ce soit un effort de triomphe, mais cela fonctionnerait probablement.

12
Scott Weinstein

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 la structure de vos 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, voir 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 des langages de programmation différents.

7
gerryLowry

Consultez ce lien, qui traite du problème et montre comment combiner le code VB et le code C # dans un projet, dans .NET 4.0

http://msdn.Microsoft.com/en-us/library/t990ks23.aspx

6
Kevin

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 CSCodeFilesIn Web.Config, ajoutez un nouvel élément à la 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 présent dans l'espace de noms ci-dessus ., Écrivez-le maintenant dans rasoir à l'aide d'un fichier cshtml.

<p>@Model.FirstName</p>

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

2
RickIsWright

Bien que Visual Studio ne prenne pas cela en charge (vous pouvez faire quelques astuces et obliger MSBuild à compiler les deux, mais pas à partir de Visual Studio), SharpDevelop ne. Vous pouvez avoir les deux dans la même solution (tant que vous utilisez Visual Studio Professional et versions ultérieures). La solution la plus simple si vous souhaitez continuer à utiliser Visual Studio consiste à séparer votre code VB dans un projet différent et à y accéder. c'est comme ça. 

2
Kris Erickson

Oui, il est possible d’ajouter des projets c # et vb.net dans une solution unique.

step1: Fichier-> Ajouter-> Projet existant 

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

step3: Sous forme vb.net où vous voulez utiliser c # forms-> importer un espace de noms de projet.

2
user6808128

Je ne vois pas comment vous pouvez compiler un projet avec le compilateur C # (ou le compilateur VB) sans l'avoir en désaccord avec le 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.

1
rein

Pourquoi ne pas vous contenter de compiler votre code VB dans une bibliothèque (.dll), de le référencer plus tard à partir de votre code et c'est tout. Géré dlls contient MSIL pour lequel c# et vb sont compilés.

1
Ajov

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

1
svinto

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

Cela dit, si vous venez de convertir VB en C #, pourquoi voudriez-vous écrire du nouveau code en VB?

1
Adam Robinson

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

1
mgbeers

Comme d'autres l'ont dit, vous ne pouvez pas mettre les deux dans un seul projet. Toutefois, si vous souhaitez simplement inclure un petit morceau de code C # ou VB dans un projet dans un autre langage, il existe des outils de conversion automatiques . Ils ne sont pas parfaits, mais ils font très bien la plupart des choses. En outre, SharpDevelop a un utilitaire de conversion intégré.

0
Scott Whitlock

Dans notre scénario, il s’agit d’un seul projet VB.NET (application Windows Desktop) dans une solution unique. Cependant, nous voulions tirer parti des fonctionnalités C # telles que les entiers signés/non signés, 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, nous compilons à l'aide du compilateur Rosalyn (VB/CS) respectif dans DLL et nous chargeons dynamiquement dans l'assembly actuel. Bien sûr, nous devions travailler sur la dissociation, le déchargement, le rechargement, la dénomination, etc. des DLL dynamiques et la gestion de la mémoire si nous utilisions largement le GUID dynamique pour nommer afin d'éviter les conflits . dans n'importe quelle base de données de notre application de bureau, écrivez une requête SQL, convertissez la connexion en connexion LINQ et écrivez des requêtes LINQ également, qui nécessitent toutes la création dynamique du code source, la compilation dans DLL et la liaison à l'assembly actuel.

0
Venkat

Non, pas dans le même projet, mais vous pouvez les utiliser dans la même solution . Cependant, vous devez veiller à ce que votre code soit 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 ints non signés.

0
juhi