2010-11-09 18 views

Répondre

2

Je suppose que votre classe C# est une classe statique. Vous devez créer une couche d'interopérabilité dans C++/CLI avant de pouvoir l'utiliser en C pur. Créez une classe C++/CLI pour envelopper votre classe C#. Une fois cela fait, utilisez la fonction d'exportation pour exporter les fonctions spécifiques C. C++/CLI gérera l'interop à votre place. La règle générale est que si vous avez une CLI, la classe/fonction sera CLI. Vos fonctions externes ne doivent donc renvoyer que des types de données natifs.

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

Voici un article pour vous aider à démarrer. Il convertit C++ en C# mais le processus est inversé dans votre cas. CodeProject Malheureusement, il n'y a pas de retour PInvoke pur C.

Malheureusement je n'ai jamais passé de C# à C. Cela ressemble à un projet intéressant. Bonne chance!

Ok Si vous ne l'avez pas encore compris, j'ai un échantillon rapide pour vous.

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++ Projet CPPCLibrary.h (avec option Compilé C++/CLI avec les dépendances du projet)

#pragma once 

using namespace System; 

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

C Projet CTest .c (compilé en tant que code 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; 
} 

Tous les fichiers sont dans la même solution mais différents projets. J'ai confirmé que cela a fonctionné. J'espère que cela aidera tous ceux qui en auront l'occasion.

À la votre!

+0

Si j'ai un peu de temps je voudrais créer une petite démo. Cela semble amusant. –

0

Si le code est C pur, vous pourriez le mettre dans un C++ visuel projet d'assemblage sans trop de difficulté. De là, vous auriez accès à un .net api régulier.