2 votes

Intégrer du C++ standard dans une application .NET

Je souhaite écrire une bibliothèque algorithmique en C++ standard, indépendant de la plate-forme.

Puis-je prendre le même code C++ et le compiler pour .NET afin qu'une application C# puisse utiliser la bibliothèque ? Si ce n'est pas le cas, quel est le moyen le plus simple de réaliser ce type d'interopérabilité ?

5voto

Konrad Rudolph Points 231505

Il n'est pas possible d'établir une interface directe entre C# et C++ standard. Cependant, vous pouvez utiliser votre bibliothèque C++ à l'intérieur d'un wrapper C++/CLI qui rend la fonctionnalité disponible dans le code géré .NET (et donc C#).

Il suffit d'écrire le wrapper sous la forme d'une bibliothèque C++/CLI qui expose une API .NET et inclut le code de votre bibliothèque C++ standard (qui ne peut malheureusement pas être liée statiquement, pour autant que je sache).

4voto

Kate Gregory Points 13451

Vous avez trois façons d'exposer votre bibliothèque pour qu'elle soit facilement appelée à partir d'un code géré :

  • écrire un wrapper C++/CLI qui contiendrait une fonction public ref class - le code C# appellera des méthodes de cette classe, qui appelleront des méthodes natives de votre bibliothèque
  • exposer une fonction de style C de votre bibliothèque en tant que DLL - le code C# utilisera P/Invoke pour appeler la fonction
  • écrire un composant COM en C++ qui utilise votre bibliothèque et l'appeler à partir du code C# en lui ajoutant une référence COM.

Le troisième, COM, n'est inclus que pour des raisons d'exhaustivité. Ce ne serait pas mon premier choix. Ni mon troisième. C'est une chose que le composant COM existe, c'en est une autre que de l'écrire juste pour cela.

Entre les deux premiers, il s'agit de savoir qui d'autre pourrait utiliser cette bibliothèque. Si le code C# est le seul à l'utiliser, faites ce que vous voulez. Mais par exemple, vous pourriez avoir 15 ou 20 méthodes natives qui définissent diverses propriétés, suivies d'une méthode go o execute qui effectue le travail proprement dit. Parce que l'interopérabilité gérée-native a un coût, je vous dirais d'écrire une fonction C++/CLI qui prend 20 paramètres, appelle les différentes fonctions natives et appelle ensuite la méthode go o execute . Vous disposez ainsi d'une interface plus dense au lieu d'une interface bavarde et vous réduisez vos coûts d'interopérabilité.

-1voto

Dave Ferguson Points 906

Vous pouvez appeler des bibliothèques C/C++ natives à partir de n'importe quel langage .NET en utilisant pinvoke. Voici un rapide tutoriel de MSDN . Vous pouvez également créer une dll COM en C++ à laquelle vous pouvez faire référence directement à partir de C# à l'aide de COM Interop. À moins que vous n'ayez besoin des avantages de COM, pinvoke est une voie beaucoup plus facile à suivre.

Et bien sûr, comme Konrad l'a indiqué, vous enveloppez la dll C++ à l'aide d'une solution C++ gérée.

A titre d'exemple, consultez http://www.pinvoke.net/ pour obtenir des exemples sur la manière d'appeler des interfaces win32 à partir de C#.

Extrait du lien MSDN ci-dessus (modifié selon le commentaire ci-dessous) :

using System;
using System.Runtime.InteropServices;

class PlatformInvokeTest
{
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int puts(
        [MarshalAs(UnmanagedType.LPStr)]
        string m);
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int _flushall();

    public static void Main() 
    {
        puts("Hello World!");
        _flushall();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X