Conversion de la bibliothèque de liens statiques en dll dynamique
J'ai .fichier lib avec son en-tête (.h) fichier. Ce fichier ont quelques fonctions qui doivent être mises en application en C#.
Après recherche sur google, j'ai trouvé que j'ai besoin de créer une dynamique DLL à partir de cette bibliothèque statique et d'appeler cette dynamique DLL à partir de code C# à l'aide de l'interopérabilité.
- J'ai créé un projet win32 et sélectionné le type de fichier DLL.
- Inclus fichier d'en-tête et ajouté .lib de dépendances supplémentaires.
Je suis capable de voir les fonctions définies dans la bibliothèque statique (lorsque j'appuie sur ctrl + espace).
Comme un débutant total, je ne sais pas comment je peux exporter la fonction, qui est, dans .lib avec la signature suivante:
void testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)
Je veux la même signature dans mon dynamiques DLL avec un nom différent.
Quoi écrire dans le fichier d'en-tête et .fichier cpp?
source d'informationauteur Manjoor
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez recompiler votre lib, il suffit d'ajouter
__declspec(dllexport)
pour les signatures de toutes les fonctions que vous souhaitez exporter.Si vous ne pouvez pas faire cela, alors vous pouvez les exporter par la rédaction d'un .def fichier à la place. À l'aide de def de fichiers, vous pouvez même changer le nom d'une fonction, telle qu'elle est exportée.
http://msdn.microsoft.com/en-us/library/28d6s79h.aspx
---- contenu de mylib.def ----
Puis quand vous le lien de la dll, comprennent mylib.def
Edit2:
noter que pinvoke suppose que les fonctions que vous importez ont _stdcall convention d'appel, à moins que vous dire le contraire. Donc, vous pourriez avoir besoin de le faire, dans votre code C#.
Ou, vous pouvez changer votre code C++ à __stdcall
Créer un nouveau projet Dll à l'aide de Visual Studio Assistant de l'Application, et cochez la case "Exporte des Symboles" dans l'une des étapes de l'Assistant. Il crée exemple de Dll qui exporte de la classe, de la fonction et de variable. Vous pouvez apprendre à partir de cet exemple, comment faire.
Généralement, chaque fonction exportée est déclaré comme étant de __declspec(dllexport). Dans un projet client, il est déclaré comme étant de __declspec(dllimport). Code de la Dll utilise la constante qui est souillé qu' __declspec(dllexport) à l'intérieur du projet de Dll, et __ _ _ declspec(dllimport) dans tout autre lieu.
C'est ce que vous pouvez faire
Ajoutez le code suivant pour vous .H fichier. renommer "MYPROJECT" au nom du projet
Allez dans les Propriétés->C++->Préprocesseur et Ajouter la defenition - MYPROJECT_EXPORTS
Ajouter MYPROJECT_API à toutes les fonctions que vous voulez de la dll pour exposer par exemple:
Aller au Projet Général des propriétés -> Type de Configuration de changer de Dynamique Dll
Vous êtes fait
La cible de dll, je suis en train d'écrire, est un wrapper pour populaire lzo de la bibliothèque.
J'ai créé le projet par le nom de LZO.
Voici à quoi ça ressemble dans mon application réelle.
LZO.h
LZO.cpp
Et finalement mon code C#
où suis-je wrog???
il existe deux versions de LIB peut être généré,
la première est la dynamique de la lib, (fichier source + tête+ dynamique lib) --> pour accéder à la DLL
ou statique lib=(dynamique lib+DLL) --> (fichier Source+en-tête) --> pour accéder à la DLL.
si vous avez la Dynamique Lib > il n'y a aucun moyen pour créer la DLL (vous ne pouvez pas obtenir quelque chose à partir de rien), dynamique lib est juste une interface,
mais si vous avez la Lib Statique puis il n'y a pas besoin de DLL pour accéder aux il est des fonctions.
Prendre un coup d'oeil à ma réponse à cette question pour une solution possible. Presque positif cela fonctionne pour vous...
En bref: Permettre à la section "Utilisation de la Bibliothèque de la Dépendance des Intrants" option dans vos paramètres de l'éditeur de liens. Si la valeur est "true", il sera force de la liaison de TOUS les symboles & code déclarée dans tous les LIB spécifié comme entrée pour le projet.
La question ici n'est pas la façon dont le code est décoré, c'est l'étape supplémentaire de la création d'une bibliothèque statique qui contient tous les points d'entrée, et d'essayer de construire la dll.
Si vous allez avec l' __delcspec approche et de construire la bibliothèque statique d'abord, puis essayer de se lier à lui lors de la construction d'une DLL, vous aurez à résoudre les morts-code de décapage problème.
Lorsque vous lien, l'obj croix de saint-andré sont utilisés pour trouver tous les décorés les exportations et les dépendances sont résolues, tout le reste est dépouillé. Si vous n'avez pas de DLL src, donc pas de fichiers obj (sauf peut-être une dll principal), tout le code de la lib que vous souhaitez exporter sera dépouillé (indépendamment des attributs).
Donc, soit vous devez: