Como usar o código C ++ existente em .NET (C #)
-
22-07-2019 - |
Pergunta
Eu gostaria de criar um projeto C # e implementar a (C ++) código existente nativa. Alguém sabe sobre qualquer bom tutorial sobre isso?
Obrigado!
Outras dicas
Se o seu código C ++ é gerido (como você diz), então eu sugiro que você deixá-lo como C ++ menos você tem uma boa razão para - futuro C # (etc.) assembleias deve ser capaz de simplesmente fazer referência a ela 'como está'.
Eu assumo pelo implementar o código existente quer dizer que você quiser chamá-lo de C #, com alterações mínimas no código C ++.
Eu sou um fã e recente comprador do livro C ++ / CLI em Ação que tem um par de capítulos de amostra úteis online.
Este introdução em CodeProject é um ponto de partida bom.
O autor do C ++ / CLI em Ação tem uma série de artigos sobre CodeProject, desça até a ++ / CLI secção C em seu índice .
O href="http://en.wikipedia.org/wiki/Platform_Invocation_Services" rel="nofollow artigo Wikipedia em P / Invoke tem uma série de razões pelas quais você pode não querer para usar essa abordagem, com a qual concordo:
- perda de apoio de digitação pelo compilador questões
- possível de tipos de dados ou de alinhamento como você tem que mapear tipos de mão
- necessidade de objetos de coleta de lixo de pinos
O melhor ponto de partida no MSDN é a resumo do artigo .
wrappers Por que você não tenta gerenciados para o seu código C ++.
Provavelmente a maneira mais fácil de fazer isso é criar um projeto C ++ / CLI, o que permitirá a você misturar gerenciados e não gerenciados C ++. Você pode em seguida, enrole as classes seu não gerenciado C ++ existente com um gerenciado .Net wrapper que seu código C # pode chamar diretamente. revista MSDN tem uma boa introdução artigo em C ++ / CLI.
Interop só vai realmente ser útil para chamar funções de estilo C. Você não pode realmente usá-lo para interagir com as classes C ++ puro.
Eu aprendi isso fazendo isso, então eu não tenho um bom tutorial, mas há algumas coisas que você precisa estar ciente de - C conseguiu ++ e C ++ / CLI tanto integrar com código não gerenciado com muito poucas costuras feias. Este não é o caso com C #. Em gerenciado C ++, é bastante possível fazer algo parecido com isto:
dotNetForm->Text = S"My Project"; // regular managed code
::SetWindowText(dotNetForm->Handle, "Your Project"); // mixed managed/unmanaged
enquanto que em C # você teria que P / Invoke para SetWindowText - não que você realmente faria: é apenas um exemplo simples, mas você precisa estar ciente de que o compilador C ++ gerenciado é uma combinação estranha de fazer um monte de interoperabilidade para você de forma transparente e não fazer nada para você, ao mesmo tempo (ou seja, ele não fará nenhum marashalling implícita).