chamar código gerenciado de código não gerenciado
Pergunta
Eu quero chamar meu código .NET de C ++ não gerenciado. Meu processo entrypoint é .NET base, então eu não precisa se preocupar com hospedagem do CLR. Eu sei que isso pode ser feito usando wrappers COM para objetos .NET, mas eu gostaria de acessar métodos estáticos individuais de classes gerenciadas, assim COM não é o meu caminho mais curto / mais fácil.
Obrigado!
Solução
Assumindo que você está falando de código não gerenciado reais - não apenas C ++ nativo em execução em um modo misto assembly compilado com / clr - a maneira mais fácil é criar um wrapper para o código .NET em C ++ / CLI. Você pode então exportar os ++ / métodos CLI C por apenas marcando-as com __declspec (dllexport).
Como alternativa, se você tem controle sobre a invocação do código não gerenciado, você pode organizar função ponteiros aos seus métodos .NET e passá-las para o código não gerenciado.
Outras dicas
Olhe para esta solução: https://sites.google.com/site/robertgiesecke/Home/uploads/ unmanagedexports A solução permite chamar a função C # a partir de C por decorar a sua função com atributo [dllexport] (oposto de P / Invoke DllImport).
exmaple:
código C #
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
código C:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
Output:
The solution is found!!! Z is 15
Atualizar : Há uma pergunta e uma boa resposta nos comentários:
Como posso incluir a dll no projeto não gerenciado?
Você tem que link para o arquivo .lib que é gerado após a compilar o código C # ( https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396 )
Eu acredito que você está procurando PInvoke reversa. Se você google para pinvoke reverso você vai ter um monte de entradas votos. Eu acho o seguinte tem uma boa e rápida exemplo sujo.
O seu código de chamada é C ++ com / clr habilitado. Certo?
Se sim, então você pode simplesmente usar a instrução usando a usar o seu .NET dll em seu código. Algo como:
#using <Mydll.dll>
e, em seguida, você pode simplesmente fazer os objetos de suas classes gerenciadas como:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
Se você quiser fazer esse obj um membro de dados de sua classe a usar gcroot é o caminho a percorrer.