2010-11-09 9 views

risposta

2

Immagino che la tua classe C# sia una classe statica. È necessario creare un livello di interoperabilità in C++/CLI prima di poterlo utilizzare in puro C. Creare una classe C++/CLI per avvolgere la classe C#. Fatto ciò, utilizzare la funzione di esportazione per esportare le funzioni specifiche C. C++/CLI gestirà l'interoperabilità per tuo conto. La regola generale è se la classe/funzione ha una CLI che sarà CLI. Quindi le tue funzioni esterne dovrebbero restituire solo tipi di dati nativi.

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

Ecco un articolo per aiutarti a iniziare. Converte C++ in C# ma il processo è invertito nel tuo caso. CodeProject Sfortunatamente non vi è alcuna inversione conveniente PInvoke per puro C.

Purtroppo non sono mai andato da C# a C. Sembra un progetto interessante. In bocca al lupo!

Ok Se non l'hai ancora capito, ho un campione veloce per te.

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++ Progetto CPPCLibrary.h (compilato con C++/CLI Opzione con dipendenze di progetto)

#pragma once 

using namespace System; 

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

C Progetto CTest .c (Compilato come codice 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; 
} 

Tutti i file si trovano nella stessa soluzione ma in progetti diversi. Ho confermato che ha funzionato. Spero che questo aiuti chiunque lo trovi.

Cheers!

+0

Se avrò un po 'di tempo mi piacerebbe creare una piccola demo. Sembra divertente. –

0

Se il codice è C puro, potresti essere in grado di inserirlo in un C++ visuale progetto di assemblaggio senza troppe difficoltà. Da lì, avresti accesso a una normale .net api.

Problemi correlati