É 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.


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.


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).

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.


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



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.


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.