2010-11-09 14 views

Respuesta

2

Supongo que su clase C# es una clase estática. Necesita crear una capa de interoperabilidad en C++/CLI antes de poder usarla en puro C. Cree una clase C++/CLI para ajustar su clase C#. Una vez hecho esto, use la función exportar para exportar las funciones específicas C. C++/CLI administrará la interoperabilidad en su nombre. La regla de oro es que si su clase/función tiene alguna CLI, SERÁ CLI. Por lo tanto, sus funciones externas solo deberían devolver tipos de datos nativos.

extern "C" __declspec(dllexport) int MyFunc(long parm1); 

Aquí hay un artículo para ayudarlo a comenzar. Convierte C++ en C# pero el proceso se invierte en su caso. CodeProject Desafortunadamente no existe un reverso conveniente PInvoke para puro C.

Lamentablemente, nunca he pasado de C# a C. Parece un proyecto interesante. ¡Buena suerte!

Ok Si aún no lo has descubierto, tengo una muestra rápida para ti.

C# CSLibrary.Math.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CSLibrary 
{ 
    static public class Math 
    { 
     static public int Add(int a, int b) 
     { 
      int c = a + b; 
      return c; 
     } 
    } 
} 

CPP/C++ Proyecto CPPCLibrary.h (compilados con la opción C++/CLI con las dependencias del proyecto)

#pragma once 

using namespace System; 

extern "C" __declspec(dllexport) int MathAdd(int a, int b) 
{ 
    return CSLibrary::Math::Add(a, b); 
} 

C Proyecto CTest .c (compilado como código C)

#include "stdafx.h" 
#pragma comment(lib, "../Debug/CPPCLILibrary.lib") 

extern __declspec(dllimport) int MathAdd(int a, int b); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int answer = MathAdd(10, 32); 
    _tprintf(_T("%d\n"), answer); 
    return 0; 
} 

Todos los archivos tienen la misma solución pero diferentes proyectos. Confirmé que esto funcionó. Espero que esto ayude a cualquiera que se encuentre con esto.

¡Salud!

+0

Si tengo algo de tiempo, me gustaría crear una pequeña demostración. Esto suena divertido. –

0

Si el código es puro C, podrías ponerlo en un C++ visual proyecto de montaje sin demasiada dificultad. Desde allí, tendrías acceso a una API regular .net.

Cuestiones relacionadas