web-dev-qa-db-fra.com

Est-il possible d'exporter des fonctions à partir d'un C # DLL comme dans VS C ++?

Dans VS C/C++, vous pouvez utiliser extern "C" __declspec(dllexport) -function declaration-.

Comment puis-je accomplir cela dans une DLL C #? Existe-t-il un code C # équivalent au code ci-dessus?

Modifier: Plus d'infos

J'essaie de créer un complément pour Notepad ++ et je veux utiliser C #, mais la manière courante que j'ai vue jusqu'à présent est d'utiliser du code C++ hérité avec l'appel ci-dessus pour exporter quelques-unes des fonctions que Notepad ++ prévoit d'importer et appel. Il existe un exemple d'application utilisant C #, mais cela nécessite toujours une DLL de chargeur, qui d'après les commentaires/réponses ci-dessous est le seul moyen pour C #.

30
Mike Webb

Exportations non gérées => https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

DLLExport => https://github.com/3F/DllExport

Comment ça marche?

Créez une nouvelle bibliothèque de classes ou poursuivez avec une bibliothèque existante. Ajoutez ensuite le UnmanagedExports package Nuget .

C'est à peu près toute la configuration requise.

Vous pouvez maintenant écrire n'importe quel type de méthode statique, décorer avec [DllExport] et l'utiliser à partir du code natif.
Cela fonctionne exactement comme DllImport, vous pouvez donc personnaliser le regroupement des paramètres/résultats avec MarshalAsAttribute.

Lors de la compilation, ma tâche va modifier l'IL pour ajouter les exports requis ...

30
hB0

J'ai déjà vu des gens faire cela, mais cela a nécessité un ildasm, en ajoutant le MSIL .export directive, puis réassemblage. n programme nommé dll_tool peut effectuer ces étapes pour vous.

Si vous souhaitez créer un mode mixte DLL avec des exportations natives et gérées, vous devez utiliser C++/CLI, spécialement conçu à cet effet.

19
Ben Voigt

Oui, il est possible d'exporter des fonctions à partir d'une DLL C # de la même manière que C++ le fait! Vous avez besoin d'un peu d'aide d'un complément Exportations non gérées (DllExport pour .Net) qui facilite ce processus, ou d'une méthode similaire telle que Exportation de fonctions en C #/VB.NET vers code natif .

Veuillez consulter Code pour exporter C # DLL vers Metatrader Build 600 + pour un exemple de travail utilisant le modèle de projet C # pour les exportations non gérées de Robert Giesecke pour exporter une DLL C # vers une application héritée) (Metatrader) qui a beaucoup de similitudes avec C++.

De plus, vous pourriez trouver Interopérabilité native et .NET intéressant bien qu'il soit principalement orienté vers l'accès au code natif à partir de .NET plutôt que l'inverse.

8
Patrick White

Non, vous ne pouvez pas faire cela dans le même sens que vous le faites en C et C++.

Mais vous pouvez créer l'API COM pour atteindre ce que vous pouvez ensuite utiliser dans le code C et C++.

Voir ces articles

2
Nawaz