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!

Foi útil?

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 )

Dê uma olhada na GCHandle classe e a palavra-chave gcroot, que fornece uma typesafe, templated invólucro em torno GCHandle.

Você pode usá-los para manter uma referência a um objeto CLR (ou um valor em caixa) em código nativo.

MSDN tem um básico tutorial aqui .

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.

PInvoke -Reverse PInvoke e __stdcall - __cdecl

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top