8
votes

Comment appelle-t-je les DLL C ++ / CLI (.NET) à partir d'applications non exploitées standard et non gérés?

Dans le monde non géré, j'ai pu écrire un __declSpec (dllexport) ou, vous pouvez également utiliser un fichier .def pour exposer une fonction pour pouvoir appeler une DLL. (En raison de Nom Mangling en C ++ pour le __stdCall, je mets des alias dans le fichier .def afin que certaines applications puissent réutiliser certaines fonctions de DLL exportées.) Maintenant, je suis intéressé à pouvoir exposer une seule fonction d'entrée d'entrée d'un. .NET Assembly, à la mode non gérée, mais faites-la entrer dans des fonctions .Net-style dans la DLL. Est-ce possible, de manière simple et simple?

Ce que j'ai est un programme tiers que j'ai étendu via des DLL (plug-ins) qui mettent en œuvre des mathématiques complexes. Cependant, le programme tiers n'a aucun moyen de visualiser les calculs. Je souhaite en quelque sorte prendre ces fonctions de mathématiques pré-écrites, les compiler dans une DLL séparée (mais en utilisant c ++ / cli dans .NET), mais ajoutez ensuite des crochets aux fonctions afin que je puisse rendre ce qui se passe sous la hotte dans un .NET. Contrôle de l'utilisateur. Je ne sais pas comment mélanger les trucs .NET avec les trucs non gérés, ou quoi sur Google pour accomplir cette tâche.

Des suggestions spécifiques concernant le pont géré / non géré ou les méthodes alternatives pour accomplir le rendu de la manière que j'ai décrite seraient utiles. Merci.


0 commentaires

3 Réponses :


3
votes

Cet article de codeProject explique le processus plutôt bien.

à l'aide de code géré dans une application non géographique
http://www.codeproject.com/kb/mcpp/ijw_unmanaged.aspx

Voir aussi ici et ici .


0 commentaires

5
votes

Utilisez-vous C ++ / CLI parce que vous le souhaitez, ou parce que vous pensez avoir à exporter des fonctions?

Dans le cas de ce dernier, consultez mon Exportations non gérées , qui vous permet de déclarer des exportations non gérées dans C # équivalent à la manière dont Dllimport fonctionne. P>

internal class Sample
{
  [DllExport("_export_test", CallingConvention.Cdecl)]
  static int Test(int a)
  {
     return a + 1;
  }
}


2 commentaires

Je voulais utiliser C ++ / CLI car la bibliothèque tiers compilerait automatiquement en utilisant uniquement l'option / CLR. Ensuite, ajouter des cravates au .NET Framework rendrait la vie beaucoup mieux (je pense.) Votre exemple semble être une approche raisonnable. Merci.


Je ne suis pas sûr de vous suivre ici. Lorsque vous prenez mon modèle de projet, cela compilera automatiquement (il créera même un fichier .lib). Sauf que je vous ai mal compris et que vous souhaitez réellement utiliser C ++ / CLI.



6
votes

Eh bien, le compilateur C ++ / CLI le rend assez facile. Écrivez simplement une fonction gérée statique et attribuez-la avec __declSpec (Dllexport). Le compilateur injecte un talon qui charge automatiquement le CLR pour exécuter le code géré.

C'est une approche facieuseable, ce n'est pas très extensible et ce ne sera pas très rapide. La prochaine étape est que vous écrivez une classe REF avec l'attribut [Comvissible (True)]]. Après l'avoir inscrite avec REGASM.EXE, tout client compatible commercialisé non géré peut utiliser ce serveur. Hébergement Le CLRC vous-même (CorbindtoruntimeEx) est généralement le dernier choix, mais le plus universel. P>


Exemple code: P>

ref class ManagedClass {
public:
  static void StaticFunc() {}
};

extern "C" __declspec(dllexport)
void __stdcall UnmanagedFunc() {
  ManagedClass::StaticFunc();
}


4 commentaires

Si j'ai besoin de __stdCall sur le nom et souhaitez vous débarrasser de la @Number sur le nom Mangling et devez créer un alias dans un fichier .def, comment puis-je faire dans ce cas? Ce dont j'ai besoin est une signature de style externe "C" afin qu'elle puisse être appelée par un type spécifique d'application tierce.


Utilisez simplement l'extérieur «C» et les déclarateurs __STDCAll sur l'exportation. Vous n'avez pas besoin d'un fichier .def. Échantillon posté.


@Hanspassant que voulez-vous dire par "compilateur injecte un talon"? Le compilateur génère-t-il un .Lib (et l'appelant de non exploitéfuncunc () aurait-il besoin de lier avec la lib)?


Le compilateur C ++ génère automatiquement beaucoup de code magique. C'est le travail d'un compilateur, cela rend le code apparemment très difficile l'air facile. Héritage multiple avec des classes de base virtuelles, c'est la science de la fusée. Ce talon, beaucoup plus facile.