2010-01-21 7 views
1
  1. Quelle est la différence de créer une DLL C simple entre l'utilisation de Visual Studio 2005 et Visual C++. J'ai vu que lors de la création sous studio aussi un manifeste a été créé et j'ai eu quelques problèmes concernant le déploiement dans une autre machine à cause de l'utilisation du dossier côte à côte (quand appeler cette DLL forme une application C#
  2. Comment fonctionne le mécanisme de appelant un travail dll?

Mercicompilant dans Visual Studio 2005 et Visual C++ 6.0

+0

Je pense que vous voulez dire « studio » dans le titre , pas "stdio" qui est quelque chose de totalement différent B-) (Et évidemment, je ne peux plus éditer, je crois que je pouvais ... hrm) –

+0

Je pense que ça devrait être deux questions distinctes, puisque # 2 a très peu à voir aveC# 1. –

+0

Il n'y a aucune différence, Visual C++ fait partie de Visual Studio 2005. VC++ 6.0 est une version antérieure. –

Répondre

1

Puisque nobugz a déjà couvert votre première question, permettez-moi de développer la seconde. Ce n'est pas très difficile à comprendre. Lorsque vous compilez une DLL dans Windows, l'éditeur de liens crée une table d'adresses d'exportation (EAT) qui répertorie toutes les fonctions exportées (fonctions fournies par la DLL) et un pointeur vers l'emplacement où elles sont implémentées dans la DLL elle-même. Lors de la compilation d'une application qui lie à une DLL, l'éditeur de liens crée une table d'adresses d'importation (IAT) énumérant toutes les fonctions implémentées dans les autres DLL et le nom de la DLL qui implémente ces fonctions. La façon dont il sait qu'une fonction existe dans une DLL provient du fichier .lib que vous ajoutez à votre projet. Cela indique à l'éditeur de liens qu'une fonction est implémentée dans une DLL. Puis lors de l'exécution, lors du chargement d'une application, le chargeur Windows examine l'IAT pour voir quelles DLL doivent être chargées, les localise et met à jour les applications IAT (en mémoire) pour pointer vers les fonctions exportées dans la DLL chargée .

C'est la base de la façon dont cela fonctionne, j'espère que je n'ai pas inclus d'inexactitudes grossières. Et bien sûr P/Invoke est une autre couche en plus de cela.

Si vous souhaitez plus d'informations sur la façon dont le travail de DLL, il y a toujours le MSDN documentation et si vous voulez suffisamment de détails pour vous faire tourner la tête lire ces articles Inside Windows Part 1 et Part 2

2

Oui, si vous compilez le code de DLL avec/MD (réglage par défaut), vous devez deploy the CRT libraries à la machine cible. Si cela est juste une DLL autonome sans Toutes les autres dépendances, il est donc logique de compiler avec l'option CRT statique de sorte que vous n'avez pas à déployer les bibliothèques.Cliquez-droit sur votre projet DLL, Propriétés, C/C++, Co de Génération, Bibliothèque d'exécution =/MTd pour la configuration de débogage. Répétez l'opération pour la configuration Release, en utilisant maintenant/MT.

Google "P/Invoke marshaling" pour en savoir plus sur la manière dont le code non géré est appelé à partir d'un programme géré.

Questions connexes