Chamando código C++ Native (Não Gerenciado) do código C# (Gerenciado):

C# pode chamar código C++ somente se o código C++ for um DLL (Dynamic Link Library).

Crie um projeto C++ no Visual Studio e mude seu tipo para um DLL.

Eis o que você faria:

image

Uma referência ao dll não pôde ser adicionada. Certifique-se de que o arquivo está acessível e que ele é um conjunto válido ou componente COM. Você ainda não terminou, você tem que escrever código C++ de uma maneira diferente.

Você precisa codificar em um formato semelhante ao seguinte:

extern "C" 
{ 
    __declspec(dllexport) int TestFunc()
    { 
    } 
  
    __declspec(dllexport) int TestFunc1() 
    { 
    }
}

No código acima:

extern "C"             //write exactly like this, can contain multiple functions
__declspec(dllexport)  //Tells to export this function
int                    //return type of the function
__cdecl                //Specifies calling convention,cdelc is default, so this can be omitted

// and function
TestFunc()
{
}

Escreva algumas funções e construa-a. E pegue o DLL criado.

Agora, na parte C#, você não precisa referenciar esse DLL em um projeto C#, você precisa colocar o DLL em algum lugar e copiar o caminho completo dele.

Você não pode usar Adicionar referência para importar facilmente este projeto DLL para C#.

Se você tentar, você pode obter o erro dizendo:

Uma referência ao dll não pôde ser adicionada. Certifique-se de que o arquivo está acessível e que ele é um conjunto válido ou componente COM.

No código C#, você tem que redefinir cada função que você precisa chamar.

[DllImport("dllpath.dll", CallingConvention=CallingConvention.Cdecl)]
extern void TestFunc1();
[DllImport("dllpath.dll", CallingConvention=CallingConvention.Cdecl)] 
extern void TestFunc1();

A seguir está a especificação completa do DllImport:

[DllImport("SomeDll.dll", EntryPoint = "TestFunc", SetLastError = true, Charset = Charset.Ansi, ExactSpelling = true, CallingConvention=CallingConvention.Cdecl)]

O caminho DLL é obrigatório para especificar, todos os outros são opcionais, ou seja, se não especificados, valores padrão serão usados.

Cada função precisa ser redefinida para que o DLL a seguir contenha esta função, com o EntryPoint especificado e a Conferência de Chamadas especificada.

Se tudo correu bem, quando você chamar esses métodos de C#, ele chamará os métodos de código C++ do DLL.

Se algo der errado, você pode obter um EntryPointNotFoundException, e você pode precisar re-verificar todo o procedimento novamente.


Artigo Original