Misturando C # e VB no mesmo projeto


145

Você pode misturar arquivos vb e c # no mesmo projeto para uma biblioteca de classes? Existe alguma configuração que torna possível?

Eu tentei e nenhum dos intellisense funciona muito bem, embora o compilador de segundo plano pareça lidar com isso suficientemente bem (além do fato de que eu tinha duas classes no mesmo espaço de nome com o mesmo nome e não reclamava).

Estamos tentando converter de VB para C #, mas ainda não terminamos de converter todo o código. Eu tenho que escrever um novo código, mas realmente não queria criar um novo projeto apenas para ele.


9
Por que você está escrevendo um novo código no VB se acabou de converter para C #?
14119 Adam Robinson

Aliás, pensei que seria possível usar uma abordagem híbrida usando classes parciais em dois projetos diferentes, mas parciais não podem abranger assemblies, portanto, isso também não funcionará.
11269 D. Lambert

Dang, essa seria a minha próxima tentativa.
21713 Wes Wes P

1
Corrigido minha postagem. Nós não terminamos.
Wes P

10
um dos motivos para misturar o código VB é usar seus recursos exclusivos, principalmente os recursos XML, se você estiver usando o LINQ to XML, por exemplo. Dessa forma, em vez de escrever 'from element in root.Elements ("Data")', você poderia usar a sintaxe XML dinâmica do VB: 'From element In root. <Data>'. Ao trabalhar muito com arquivos XML, essa sintaxe pode ser muito mais fácil de ser trabalhada do que os c # '
Marchy

Respostas:


128

Não, você não pode. Um assembly / projeto (cada projeto é compilado em 1 assembly normalmente) deve ser um idioma. No entanto, você pode usar vários assemblies, e cada um pode ser codificado em um idioma diferente porque todos eles são compilados no MSIL.

Ele foi compilado corretamente e não se queixou porque um projeto VB.NET na verdade só compila os arquivos .vb e um projeto C # na verdade compila apenas os arquivos .cs. Ele estava ignorando os outros, portanto, você não recebeu erros.

Editar: se você adicionar um arquivo .vb a um projeto C #, selecione o arquivo no painel Solution Explorer e, em seguida, observe o painel Properties, notando que a ação de compilação é 'Conteúdo', não 'Compilar'. Ele é tratado como um arquivo de texto simples e nem é incorporado ao assembly compilado como um recurso binário.

Edit: Com sites asp.net, você pode adicionar controle de usuário da web c # ao site vb.net


1
Existem maneiras de combinar duas montagens após o fato, mas isso não resolveria o problema desse usuário.
Steven Sudit 14/08/2009

É verdade, mas eu não toleraria isso com o único objetivo de misturar idiomas.
Joel B Fant

Eu acredito que você pode misturar c ++ gerenciado e não gerenciado no mesmo projeto.
Callum Rogers

@ Rogers: Essa situação é um bicho completamente diferente. Você pode misturar C ++ gerenciado e não gerenciado no mesmo arquivo de origem, se desejar. Mas ainda não é o mesmo que misturar VB.NET e C #.
Joel B Fant

3
@ DanHoward: Ai, queime. Definitivamente, esse é um bloco, não sendo possível misturar e combinar idiomas no mesmo projeto!

32

Bem, na verdade, herdei um projeto há alguns anos de um colega que decidiu combinar webforms VB e C # dentro do mesmo projeto. Isso funcionou, mas está longe de ser divertido de manter.

Decidi que o novo código deveria ser classes C # e, para fazê-las funcionar, tive que adicionar um subnó à parte de compilação do web.config

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

Todo o código VB entra em uma subpasta no App_Code chamada VB e o código C # na subpasta CS. Isso produzirá dois arquivos .dll. Funciona, mas o código é compilado na mesma ordem listada em "codeSubDirectories" e, portanto, as interfaces devem estar na pasta VB, se usadas em C # e VB.

Eu tenho uma referência a um compilador VB e C # em

<system.codedom>
    <compilers>

O projeto está atualmente atualizado para a estrutura 3.5 e ainda funciona (mas ainda não é divertido de manter ..)


Consulte stackoverflow.com/questions/15711964/… para obter mais detalhes
John

20

Você não pode misturar vb e c # no mesmo projeto - se você observar no visual studio os arquivos do projeto são .vbproj ou .csproj. Você pode em uma solução - ter 1 proj em vb e 1 em c #.

Parece que, de acordo com isso, você pode potencialmente usá-los em um projeto da web no diretório App_Code:

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


3
Voto negativo, porque o arquivo do projeto não é a razão pela qual você não pode produzir uma montagem a partir deles. Você pode compilar uma montagem sem que um arquivo de projeto já exista, se desejar, usando o compilador na linha de comando. O motivo de não funcionar é que um assembly é (quase sempre) um trabalho de compilação de um compilador. Não tem nada a ver com o arquivo do projeto.
Tom W

8
Voto a favor. Do ponto de vista dos usuários, a idéia de que a extensão é diferente é o sinal revelador de que você não pode /.
usar o seguinte comando

14

Pode ser possível com algum desenvolvimento personalizado do MSBuild. Os .targets fornecidos forçam os projetos a serem de idioma único - mas não há restrição de tempo de execução ou de ferramentas para impedir isso.

Os compiladores VB e CS podem gerar saída para módulos - a versão do CLR dos arquivos .obj. Usando o linker de montagem, você pode pegar os módulos dos códigos VB e CS e produzir uma única montagem.

Não que isso fosse um esforço rival, mas provavelmente funcionaria.


6
Há uma boa descrição sobre isso por Thomas Freudenberg aqui .
Dave M

1
Outro exemplo pode ser encontrado em Exemplo: Misturando C ++ Não Gerenciado, C ++ / CLI e C # pelo Junfeng Zhang's. Pode fazê-lo funcionar após a primeira execução. \ VC \ bin \ vcvars32.bat na minha instalação do Visual Studio. Na verdade, isso é misturar idiomas diferentes em um assembly, e não em um projeto.
R. Schreurs

7

Passo a passo: Usando vários idiomas de programação em um projeto de site http://msdn.microsoft.com/en-us/library/ms366714.aspx

Por padrão, a pasta App_Code não permite várias linguagens de programação. No entanto, em um projeto de site, você pode modificar a estrutura da pasta e as configurações para oferecer suporte a várias linguagens de programação, como Visual Basic e C # . Isso permite que o ASP.NET crie vários assemblies, um para cada idioma. Para obter mais informações, consulte Pastas de código compartilhadas em projetos da Web do ASP.NET. Os desenvolvedores geralmente incluem várias linguagens de programação em aplicativos da Web para oferecer suporte a várias equipes de desenvolvimento que operam independentemente e preferem diferentes linguagens de programação.


2

Embora o Visual Studio não suporte isso (você pode fazer alguns truques e o MSBuild compilar os dois, mas não no Visual Studio), o SharpDevelop sim. Você pode ter os dois na mesma solução (desde que esteja executando o Visual Studio Professional e acima), portanto, a solução mais fácil se você quiser continuar usando o Visual Studio é separar seu código VB em um projeto diferente e acessá-lo dessa maneira.


1
Como o ShartDevelop suporta isso? Eu apenas tentei e não compila. Existe algo especial que precisa ser feito?
epitka 08/09/09

2

Clique com o botão direito do mouse no projeto. Escolha Adicionar pasta asp.net. Em The Folder, crie duas pastas, uma chamada VBCodeFiles e a outra CSCodeFiles In Web.Config, adicione um novo elemento na compilação

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

Agora, crie uma página cshtml. Adicione uma referência ao VBCodeFiles.Namespace.MyClassName usando

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

Onde MyClassName é um objeto de classe encontrado no espaço para nome acima. Agora, escreva o objeto no razor usando um arquivo cshtml.

<p>@Model.FirstName</p>

Observe que o directoryName = "CSCodeFiles" é redundante se este for um projeto C # e o directoryName = "VBCodeFiles" é redundante se esse for um projeto VB.Net.


2

Sim, é possível.adicionar projetos c # e vb.net em uma única solução.

Etapa 1: Arquivo-> Adicionar-> Projeto Existente

Passo 2: Projeto-> Adicionar referência-> DLL ou exe do projeto que você adicionou anteriormente.

Etapa 3: No formulário vb.net, onde você deseja usar o c # forms-> import namespace do projeto.


1

Eu não vejo como você pode compilar um projeto com o compilador C # (ou o compilador VB) e não o ignora no idioma errado para o compilador.

Mantenha seu código C # em um projeto separado do seu projeto VB. Você pode incluir esses projetos na mesma solução.


1

Você precisa de um projeto por idioma. Estou bastante confiante de que vi uma ferramenta que mesclou montagens. Se você encontrar essa ferramenta, deve estar pronto. Se você precisar usar os dois idiomas na mesma classe, poderá escrever metade dele em VB.net, por exemplo, e depois escrever o restante em C # herdando a classe VB.net.


1

Correndo o risco de repetir todas as outras respostas, não, você não pode misturá-las no mesmo projeto.

Além disso, se você acabou de converter o VB para C #, por que escreveria um novo código no VB?


2
Porque você encontrou um erro no meu post :) Ainda não concluímos a conversão.
23409 Wes P Wes

1

Para o .net 2.0, isso funciona. Compila ambos no mesmo projeto se você criar subdiretórios no código do aplicativo com o código do idioma relacionado. Até o momento, estou procurando se isso deve funcionar em 3,5 ou não.


1

Por que você não compila seu VBcódigo em uma biblioteca ( .dll). Referencie-o posteriormente a partir do seu código e pronto. Gerenciado dllscontém MSILao qual ambos c#e vbsão compilados.


2
Você ficará completamente satisfeito se precisar fazer referência a qualquer um de seu novo código C # a partir do código herdado do VB.NET. Ou vice-versa, seja como for, são apenas referências unidirecionais.
Roman Starkov

0

Como outros já disseram, você não pode colocar os dois em um projeto. No entanto, se você tiver apenas um pequeno pedaço de código C # ou VB que deseja incluir em um projeto no outro idioma, existem ferramentas de conversão automática . Eles não são perfeitos, mas fazem a maioria das coisas muito bem. Além disso, o SharpDevelop possui um utilitário de conversão incorporado.


Existe isso. Eu poderia simplesmente absorver e codificar o que eu preciso no VB e convertê-lo mais tarde com o restante das coisas.
23409 Wes P Wes

0

Não, não no mesmo projeto. Mas você pode usá-los na mesma solução. embora você precise cuidar para que seu código seja compatível com CLS. Isso significa que você não deve ter usado essa funcionalidade / recurso que não é entendida por outro idioma. Por exemplo, o VB não entende entradas não assinadas.


0

Em nosso cenário, é um único projeto VB.NET (aplicativo Windows Desktop) em uma única solução. No entanto, queríamos aproveitar os recursos do C #, como números inteiros assinados / não assinados, literais XML e recursos de string no VB.NET. Portanto, dependendo dos recursos, em tempo de execução, criamos o arquivo de código, compilamos usando o respectivo compilador Rosalyn (VB / CS) na DLL e carregamos dinamicamente no assembly atual. É claro que tivemos que trabalhar para desvincular, descarregar, recarregar, nomear etc. das DLLs dinâmicas e o gerenciamento de memória, pois usamos amplamente o GUID dinâmico para nomear para evitar conflitos. Ele funciona bem onde o usuário do aplicativo pode se conectar a qualquer banco de dados do nosso aplicativo de desktop, escrever consulta SQL, converter a conexão em conexão LINQ e escrever consultas LINQ também, o que exige construção dinâmica do código-fonte, compilação em DLL e conexão à montagem atual.


-1

Sim, você pode adicionar os dois arquivos apenas no site da Web. Se o projeto for um aplicativo da Web, não permitirá tipos diferentes de arquivos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.