J'ai une application héritée écrite en C, et j'aimerais déplacer progressivement du code vers C#. Mais avant de pouvoir tout réécrire, je n'aurai besoin que de quelques composants écrits en C# qui seront utilisés à partir de C.Comment réutiliser un assemblage .Net à partir d'une application C pure
Répondre
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!
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.
Si j'ai un peu de temps je voudrais créer une petite démo. Cela semble amusant. –