Call C++ Native code from C#
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:
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.