É possível chamar o código C ++ de C #?

86

É possível chamar o código C ++, possivelmente compilado como um arquivo de biblioteca de código (.dll), de dentro de uma linguagem .NET como C #?

Especificamente, o código C ++, como a biblioteca de rede RakNet.

Peter Mortensen
fonte
C ++ não gerenciado para c # gerenciado
Tyler S. Loeper

Respostas:

90

Uma maneira fácil de chamar em C ++ é criar um assembly de wrapper em C ++ / CLI. Em C ++ / CLI, você pode chamar o código não gerenciado como se estivesse escrevendo um código nativo, mas pode chamar o código C ++ / CLI de C # como se ele tivesse sido escrito em C #. A linguagem foi basicamente projetada com interoperabilidade em bibliotecas existentes como seu "aplicativo matador".

Por exemplo - compile isso com a opção / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Então, em C #, adicione uma referência ao seu assembly ManagedType e use-a assim:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Confira esta postagem do blog para um exemplo mais explicado.

Eclipse
fonte
2
link quebrado para postagem no blog :(
Vidar
9

Não estou familiarizado com a biblioteca que você mencionou, mas, em geral, existem algumas maneiras de fazer isso:

  • P / Invocar para funções de biblioteca exportadas
  • Adicionar uma referência à biblioteca de tipos COM (no caso de você estar lidando com objetos COM).
Mehrdad Afshari
fonte
9

P / Invoke é uma boa tecnologia e funciona muito bem, exceto para problemas ao carregar o arquivo DLL de destino. Descobrimos que a melhor maneira de fazer as coisas é criar uma biblioteca estática de funções nativas e vinculá-la a um projeto Managed C ++ (ou C ++ / CLI) que dependa dela.

plinto
fonte
Tive problemas com callbacks ep / invoke. Mudar para C ++ / CLI resolveu esses problemas.
MedicineMan
5

Sim, é denominado P / Invoke .

Este é um ótimo site de recursos para usá-lo com a API Win32:

http://www.pinvoke.net/

Dana Holt
fonte
2

Claro que é. Este artigo é um bom exemplo de algo que você pode fazer para começar.

Fazemos isso em C # em nossos dispositivos Windows Mobile usando P / Invoke .

Mat Nadrofsky
fonte
2

A tecnologia usada para fazer isso é chamada P / Invoke ; você pode pesquisar artigos sobre o assunto. Observe que é para chamar C a partir de C #, não tanto C ++. Portanto, você precisará envolver seu código C ++ em um wrapper C que sua DLL exporta.

Frank Schwieterman
fonte