Mezclando C # y VB en el mismo proyecto

145

¿Puedes mezclar archivos vb y c # en el mismo proyecto para una biblioteca de clases? ¿Hay alguna configuración que lo haga posible?

Lo intenté y ninguno de los intellisense funciona del todo bien, aunque el compilador de fondo parece manejarlo lo suficientemente bien (aparte del hecho de que yo, entonces, tenía 2 clases en el mismo espacio de nombres con el mismo nombre y no se quejó).

Estamos tratando de convertir de VB a C # pero no hemos terminado de convertir todo el código. Tengo un código nuevo que necesito escribir, pero realmente no quería hacer un nuevo proyecto solo para eso.

Wes P
fuente
9
¿Por qué está escribiendo código nuevo en VB si acaba de terminar la conversión a C #?
Adam Robinson
Por cierto, pensé que podría ser posible lograr un enfoque híbrido usando clases parciales en dos proyectos diferentes, pero los parciales no pueden abarcar ensamblajes, por lo que esto tampoco funcionará.
D. Lambert
Dang, ese sería mi próximo intento.
Wes P
1
Se corrigió mi publicación. No hemos terminado
Wes P
10
Una de las razones para mezclar el código VB es usar sus características únicas, en particular sus capacidades XML si está utilizando LINQ to XML, por ejemplo. De esa manera, en lugar de escribir 'desde el elemento en la raíz. Elementos ("Datos")', podría usar la sintaxis XML dinámica de VB: 'Desde el elemento en la raíz. <Datos>'. Cuando se trabaja mucho con archivos XML, esta sintaxis puede ser mucho más fácil de trabajar que C # 's
Marzo

Respuestas:

129

No puedes. Un ensamblado / proyecto (cada proyecto se compila en 1 ensamblaje generalmente) debe ser un idioma. Sin embargo, puede usar múltiples ensamblajes, y cada uno puede codificarse en un idioma diferente porque todos están compilados en MSIL.

Se compiló bien y no se quejó porque un proyecto VB.NET solo compilará realmente los archivos .vb y un proyecto C # solo compilará realmente los archivos .cs. Estaba ignorando a los otros, por lo tanto, no recibió errores.

Editar: si agrega un archivo .vb a un proyecto de C #, seleccione el archivo en el panel Explorador de soluciones y luego mire el panel Propiedades, notará que la Acción de compilación es 'Contenido', no 'Compilar'. Se trata como un simple archivo de texto y ni siquiera se incrusta en el ensamblado compilado como un recurso binario.

Editar: con los sitios web asp.net puede agregar el control de usuario web c # al sitio web vb.net

Joel B Fant
fuente
1
Hay formas de combinar dos conjuntos después del hecho, pero eso no resolvería el problema de este usuario.
Steven Sudit
Es cierto, pero no lo toleraría con el único propósito de mezclar idiomas.
Joel B Fant
Creo que puede mezclar c ++ administrado y no administrado en el mismo proyecto.
Callum Rogers
@C Rogers: Esa situación es completamente diferente. Puede mezclar C ++ administrado y no administrado en el mismo archivo fuente si lo desea. Pero todavía no es lo mismo que mezclar VB.NET y C #.
Joel B Fant
44
@ DanHoward: Ay, quémate. ¡Definitivamente es un bloque allí, no poder mezclar y combinar idiomas dentro del mismo proyecto!
32

Bueno, en realidad heredé un proyecto hace unos años de un colega que había decidido mezclar formularios web VB y C # dentro del mismo proyecto. Eso funcionó pero está lejos de ser divertido de mantener.

Decidí que el nuevo código debería ser clases de C # y para que funcionen, tuve que agregar un subnodo a la parte de compilación de web.config

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

Todo el código VB entra en una subcarpeta en el App_Code llamada VB y el código C # en la subcarpeta CS. Esto producirá dos archivos .dll. Funciona, pero el código se compila en el mismo orden que aparece en "codeSubDirectories" y, por lo tanto, las interfaces deben estar en la carpeta VB si se usan tanto en C # como en VB.

Tengo una referencia a un compilador de VB y C # en

<system.codedom>
    <compilers>

El proyecto se actualiza actualmente al framework 3.5 y aún funciona (pero aún no es divertido mantenerlo).

Lars Strange
fuente
Ver stackoverflow.com/questions/15711964/… para más detalles
John
20

No puede mezclar vb y c # dentro del mismo proyecto; si observa en Visual Studio, los archivos del proyecto son .vbproj o .csproj. Puede dentro de una solución: tener 1 proyecto en vb y 1 en c #.

Parece que de acuerdo con esto, puede usarlos potencialmente en un proyecto web en el directorio App_Code:

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

Brendan
fuente
3
Voto negativo porque el archivo del Proyecto no es la razón por la que no puede producir un ensamblaje a partir de ellos. Si lo desea, puede compilar un ensamblaje sin que haya existido un archivo de Proyecto, utilizando el compilador desde la línea de comandos. La razón por la que no funcionará es que un ensamblaje es (casi siempre) un trabajo de compilación de un compilador. No tiene nada que ver con el archivo del proyecto.
Tom W
8
Voto a favor. Desde el punto de vista de los usuarios, la idea de que la extensión es diferente es el signo revelador de que no puede /.
user4951
14

Podría ser posible con algún desarrollo personalizado de MSBuild. Los .targets suministrados obligan a los proyectos a ser de un solo lenguaje, pero no hay restricciones de tiempo de ejecución o herramientas que lo impidan.

Tanto los compiladores VB como CS pueden enviar a módulos : la versión CLR de los archivos .obj. Usando el enlazador de ensamblaje, puede tomar los módulos del código VB y CS y producir un solo ensamblaje.

No es que esto sea un esfuerzo de triunfo, pero probablemente funcionaría.

Scott Weinstein
fuente
66
Hay un buen artículo sobre esto por Thomas Freudenberg aquí .
Dave M
1
Otro ejemplo de se puede encontrar en la muestra: Mezclar código C ++, C ++ / CLI y C # no administrado por Junfeng Zhang's. Podría hacerlo funcionar después de la primera ejecución. \ VC \ bin \ vcvars32.bat desde mi instalación de Visual Studio. Esto en realidad está mezclando diferentes idiomas es un ensamblaje en lugar de un solo proyecto.
R. Schreurs
7

Tutorial: Uso de múltiples lenguajes de programación en un proyecto de sitio web http://msdn.microsoft.com/en-us/library/ms366714.aspx

Por defecto, la carpeta App_Code no permite múltiples lenguajes de programación. Sin embargo, en un proyecto de sitio web, puede modificar la estructura de su carpeta y la configuración para admitir múltiples lenguajes de programación como Visual Basic y C # . Esto permite que ASP.NET cree múltiples ensamblados, uno para cada idioma. Para obtener más información, vea Carpetas de código compartido en proyectos web ASP.NET. Los desarrolladores comúnmente incluyen múltiples lenguajes de programación en aplicaciones web para soportar múltiples equipos de desarrollo que operan independientemente y prefieren diferentes lenguajes de programación.

gerryLowry
fuente
2

Aunque Visual Studio no admite esto (puede hacer algunos trucos y hacer que MSBuild compile ambos, pero no desde Visual Studio), SharpDevelop sí lo hace. Puede tener ambos en la misma solución (siempre que esté ejecutando Visual Studio Professional y superior), por lo que la solución más fácil si desea seguir usando Visual Studio es separar su código VB en un proyecto diferente y acceder a él de esa manera.

Kris Erickson
fuente
1
¿Cómo lo admite ShartDevelop? Acabo de probarlo y no se compila. ¿Hay algo especial que deba hacerse?
epitka
2

Haga clic derecho en el proyecto. Elija Agregar carpeta Asp.Net. En The Folder, cree dos carpetas, una llamada VBCodeFiles y Other CSCodeFiles In Web.Config agregue un nuevo elemento en la compilación

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

Ahora, cree una página cshtml. Agregue una referencia a VBCodeFiles.Namespace.MyClassName usando

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

Donde MyClassName es un objeto de clase que se encuentra en el espacio de nombres anterior. ahora escriba el objeto en la maquinilla de afeitar utilizando un archivo cshtml.

<p>@Model.FirstName</p>

Tenga en cuenta que el nombre de directorio = "CSCodeFiles" es redundante si se trata de un proyecto de C # y el nombre de directorio = "VBCodeFiles" es redundante si se trata de un proyecto de VB.Net.

RickIsWright
fuente
2

Sí, es posible agregar proyectos de C # y vb.net en una única solución.

Paso 1: Archivo-> Agregar-> Proyecto existente

Paso 2: Proyecto-> Agregar referencia-> dll o exe del proyecto que agregaste antes.

Paso 3: en el formulario vb.net donde quieres usar c # forms-> import namespace of project.

usuario6808128
fuente
1

No veo cómo puede compilar un proyecto con el compilador de C # (o el compilador de VB) y no hacer que se resista al lenguaje incorrecto para el compilador.

Mantenga su código C # en un proyecto separado de su proyecto VB. Puede incluir estos proyectos en la misma solución.

rienda
fuente
1

Necesita un proyecto por idioma. Estoy bastante seguro de que vi una herramienta que fusionó ensamblajes, si encuentra esa herramienta, debería estar listo. Si necesita usar ambos idiomas en la misma clase, debería poder escribir la mitad en say VB.net y luego escribir el resto en C # heredando la clase VB.net.

svinto
fuente
1

A riesgo de repetir cualquier otra respuesta, no, no puede mezclarlas en el mismo proyecto.

Aparte de eso, si acaba de terminar de convertir VB a C #, ¿por qué escribiría un nuevo código en VB?

Adam Robinson
fuente
2
Porque encontraste un error en mi publicación :) Todavía no hemos terminado de convertir.
Wes P
1

Para .net 2.0 esto funciona. Compila ambos en el mismo proyecto si crea subdirectorios del código de la aplicación con el código de idioma relacionado. Hasta el momento, estoy buscando si esto debería funcionar en 3.5 o no.

mgbeers
fuente
1

¿Por qué no compilas tu VBcódigo en una biblioteca .dll? Gestionado dllscontienen MSILa los que se compilan ambos c#y vb.

Ajov
fuente
2
Estará completamente lleno si alguna vez necesita hacer referencia a alguno de sus nuevos códigos C # del código VB.NET heredado. O viceversa, sea cual sea el camino, solo son referencias unidireccionales.
Roman Starkov
0

Como han dicho otros, no puedes poner ambos en un proyecto. Sin embargo, si solo tiene una pequeña porción de código C # o VB que desea incluir en un proyecto en el otro idioma, existen herramientas de conversión automática . No son perfectos, pero hacen la mayoría de las cosas bastante bien. Además, SharpDevelop tiene una utilidad de conversión integrada.

Scott Whitlock
fuente
Alli esta. Podría simplemente absorberlo y codificar lo que necesito en VB y convertirlo más tarde con el resto de las cosas.
Wes P
0

No, no en el mismo proyecto, pero puedes usarlos en la misma solución. aunque debe asegurarse de que su código sea compatible con CLS. Eso significa que no debe haber utilizado dicha funcionalidad / característica que no se entiende en otro idioma. Por ejemplo, VB no entiende ints sin firmar.

juhi
fuente
0

En nuestro escenario, es un solo proyecto VB.NET (aplicación de escritorio de Windows) en una sola solución. Sin embargo, queríamos aprovechar las características de C # como enteros con / sin signo y literales XML y características de cadena en VB.NET. Entonces, dependiendo de las características, en tiempo de ejecución construimos el archivo de código, lo compilamos utilizando el compilador Rosalyn (VB / CS) respectivo en DLL y lo cargamos dinámicamente en el ensamblaje actual. Por supuesto, tuvimos que trabajar en la desvinculación, descarga, recarga, nomenclatura, etc. de las DLL dinámicas y la administración de la memoria, en gran medida utilizamos el GUID dinámico para nombrar para evitar conflictos. Funciona bien donde el usuario de la aplicación puede conectarse a cualquier base de datos desde nuestra aplicación de escritorio, escribir consultas SQL, convertir la conexión a la conexión LINQ y también escribir consultas LINQ, lo que requiere una construcción dinámica del código fuente, compilar en DLL y adjuntarlo al ensamblaje actual.

Venkat
fuente
-1

Sí, puede agregar ambos archivos solo en el sitio web. Si el proyecto es una aplicación web, no permitirá diferentes tipos de archivos.

Pitón
fuente