Question

  1. Quelle est la différence de créer une DLL fémi entre l'utilisation de Visual Studio 2005 et Visual C ++. J'ai vu que lors de la création sous un studio aussi manifeste a été créé et j'ai eu quelques problèmes en ce qui concerne le déploiement dans une autre machine en raison de l'utilisation de dossier côte à côte (lors de l'appel que dll former une application C # "
  2. Comment le mécanisme d'appeler un travail dll?

Merci

Était-ce utile?

La solution

Depuis nobugz déjà couvert votre première question, permettez-moi d'élargir le deuxième. Il est pas très difficile à comprendre.

Lorsque vous compilez une DLL dans Windows, l'éditeur de liens crée une table d'adresses à l'exportation (EAT) qui répertorie toutes les fonctions exportées (les fonctions de la DLL fournit) et un pointeur à l'endroit où ils sont mis en œuvre dans la DLL elle-même.

Lors de la compilation d'une application qui se lie à une DLL, l'éditeur de liens crée une table d'adresses d'importation (IAT) répertoriant toutes les fonctions qui sont mises en œuvre dans d'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 est à partir du fichier .lib que vous ajoutez à votre projet. Cela dit l'éditeur de liens qu'une fonction est implémentée dans une DLL.

Puis au moment de l'exécution, lors du chargement d'une application, le chargeur Windows examine l'IAT pour voir ce que le besoin de DLL à charger, ce qui les localise et met à jour les applications IAT (en mémoire) pour pointer vers les fonctions exportées dans la DLL chargée.

Voilà les bases comment cela fonctionne, je l'espère, je ne comportait aucune inexactitude brute. Et bien sûr P / Invoke est une autre couche au-dessus de cela.

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

Autres conseils

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top