É possível usar C ++ com o .NET framework?

18

Eu li muitos comentários sobre programação GUI, tanto em C # quanto em C ++. E notei que o framework .NET da Microsoft é poderoso para a programação da GUI. Então, é possível usar o framework C ++ e .NET?

Eu acho que será uma ótima combinação, pois o C ++ é uma linguagem poderosa, e o .NET framework é o preferido para a programação da GUI no Windows, como eu li. É possível escrever a GUI em C # e a funcionalidade em C ++?

ddacot
fonte
7
C # também é uma linguagem muito poderosa.
Adam Crossland
2
@ Ramhound: Não é verdade que C ++ / CLI seja tão poderoso quanto C #. O código C ++ / CLI contém todas as otimizações do compilador C ++ e pode ser executado mais rapidamente, e ainda contém muitas técnicas de metaprogramação e pré-processador que não estão em C #.
DeadMG
2
Além disso, não deve ser nenhum desafio escolher C # se alguém é bom em C ++. Não estou dizendo, mas estou dizendo.
Rig
4
Como você conhece C ++, você pode escolher entre aprender C ++ / CLI ou C #. Nem é C ++ real. Eu sugiro aprender C # em vez de tentar trabalhar com C ++ / CLI; O C ++ / CLI não é um idioma nativo em nenhum lugar; portanto, você encontrará muitos livros e suporte para C #.
David Thornley
6
@ddacot não, C ++ não se destina ao desenvolvimento de jogos. Destina-se ao desenvolvimento de software, assim como todas as outras linguagens de programação. Os jogos são um tipo de software.
224126 MattDavey

Respostas:

21

Sim, era conhecido anteriormente como C ++ gerenciado e agora C ++ / CLI . Você tem acesso à totalidade do .NET Framework (GUI: WinForms, GDI +, etc.) como faria nos outros três idiomas gerenciados em pacote configurável, C #, F # e VB.NET.

Jesse C. Slicer
fonte
+1 À resposta de Jesse. Se não me engano, C ++ / CLI não suporta herança múltipla. Portanto, esteja preparado para alguns recursos inesperados. Alguns desses recursos vieram de limitações da CLI. Eu recomendo que você tente encontrar a diferença entre C ++ / CLI e C ++ 'clássico' antes de começar a usá-lo.
Igor Soloydenko
Isso é mencionado em alguns detalhes no primeiro link. O resumo é assim: "O C ++ evoluiu muito com o tempo e a maioria dos softwares escritos na linguagem é orientada a objetos. O C ++ gerenciado e o uso de classes e objetos baseados em classes permanecem predominantes como no Visual C ++. A única alteração importante no C ++ gerenciado é que os recursos de herança múltipla não são suportados. Isso ocorre devido a uma limitação do CLR. Uma classe gerenciada no coletor de lixo do CLR não pode herdar mais de uma classe. "
Jesse C. Slicer
Isso está ok. Na verdade, eu não sou bom em C ++. Eu apenas pensei que pode haver outras diferenças importantes que podem causar problemas.
Igor Soloydenko
A última vez que escreveu alguns C ++ foi, literalmente, em algum momento do século passado :)
Jesse C. Slicer
1
@keykeeper, um uso típico de C ++ / CLI é ser uma ponte fina entre uma biblioteca C ++ não gerenciada e o mundo gerenciado. É suficiente para esse uso. É claro que não faz sentido codificar algo considerável nele.
SK-logic
6

Não se esqueça da opção mais flexível e simples, uma típica para o mundo Unix, mas, por algum motivo, não é comum no Windows: dividir a GUI e a lógica em diferentes processos, comunicando-se através de qualquer forma razoável de RPC (por exemplo, mesmo um pipe) trabalhos). De preferência com um protocolo de texto simples, legível por humanos.

Dessa forma, você pode implementar sua GUI (ou várias GUIs) com as tecnologias que você preferir e criar componentes lógicos de acordo com a necessidade - C ++, scripts, qualquer outra coisa.

Não conheço nenhuma vantagem razoável de uma abordagem de design monolítico do mundo Windows.

SK-logic
fonte
4

Eu fiz isso uma vez há alguns anos atrás, nos dias do C ++ gerenciado. Tínhamos alguma lógica de negócios em uma DLL com uma assinatura que queríamos incorporar em uma GUI no estilo do assistente, escrita em C #. Para fazer isso, criei um assembly C ++ gerenciado para ficar entre o aplicativo da GUI gerenciada e a DLL não gerenciada e usei System :: Runtime :: InteropServices :: Marshal nesse assembly para converter valores de tipos gerenciados (System :: Int32) em não gerenciados tipos (int) e vice-versa.

Embora o C ++ gerenciado pareça estar obsoleto, o mesmo princípio pode se aplicar ao C ++ / CLI.

Raymond Saltrelli
fonte
3

Na verdade não. Existe uma linguagem híbrida C ++ / CLI, mas só é boa para interoperação (política oficial da Microsoft). Devido à maneira como a estrutura .NET é projetada, há muitas semânticas de linguagem que realmente não se encaixam na execução no CLR, e o C ++ exibe muitas delas.

DeadMG
fonte
7
Eu não concordo com esta afirmação. C ++ / CLI é perfeitamente adequado para muitas implementações.
Ramhound
3
@ Ramhound: a própria Microsoft recomenda apenas para interoperação. Essa é a política oficial deles.
DeadMG
2
@DeadMG você pode fornecer uma fonte para isso?
Sq33G
1
@DeadMG, você está errado. Existem muitas opções para executar a GUI do .NET com uma lógica nativa.
SK-logic
2
@DeadMG - A menos que você fornecer a prova de que a política oficial isso é da Microsoft (eu não acredito que por um minuto), então o seu apenas passando em torno de FUD
Ramhound
3

O ângulo C ++ / CLI foi coberto por muitas respostas até agora, mas outra maneira de fazer isso é usar o PInvoke. Isso permite que programas em C # chame funções contidas em DLLs que foram escritas em C ++. A vantagem do PInvoke é que sua dll é totalmente independente do fato de ser chamada de .Net. Isso significa que você pode chamar dlls para as quais você não tem código-fonte e, mesmo que você tenha o código-fonte, não precisará recompilar usando a opção / clr. Isso significa que você pode usar esta dll com outros programas C ++, bem como programas em C #. Existem algumas fantásticas bibliotecas C / C ++ por aí: o PInvoke permite que você tire proveito delas. Às vezes, as bibliotecas Win32 fornecem funções que simplesmente não estão disponíveis no .Net: PInvoke permite que você as use.

Uma das partes mais complicadas do uso do PInvoke é saber converter a assinatura não gerenciada em uma assinatura gerenciada. Mas há uma folha de dicas para ajudar com isso.

Phillip Ngan
fonte
Mas quando P / Invocar C ++ diretamente, esteja ciente de desconfigurar ou forneça um wrapper C fino no meio.
SK-logic
0

Você também pode trabalhar com um endro C # via COM (Component Object Model). Para mim, COM foi melhor do que usar o C ++ gerenciado, já que o Visual Studio 2010 não tem intellisense para o C ++ gerenciado. No meu caso, já temos um aplicativo C ++ grande, mas queríamos tentar mudar o MFC para o WinForms ou o WPF.

Travis
fonte