2010-04-27 9 views
7

SQLite de PHX Software a combiné un assembly géré (System.Data.SQLite) avec une DLL non managée (la DLL SQLite 32 ou 64 bits) dans un fichier et a réussi à les lier ensemble.Comment combiner une DLL non managée et un assembly géré en un seul fichier?

Comment faire? Ai-je besoin d'intégrer l'assembly managé dans la DLL non managée, ou vice versa?

ie. mes questions sont:

  1. Dans quel ordre dois-je faire cela?
  2. De quels outils ou connaissances ai-je besoin pour faire cela?
  3. Comment (si différent) puis-je lier aux fonctions exportées à partir de la DLL non managée dans mon code managé?

La raison pour laquelle je pose cette question est que je veux construire un wrapper zLib géré. Je sais qu'il y a des classes managées dans .NET mais par expérience elles sont un peu limitées (et un peu osées en ce sens qu'elles ne font pas de tamponnage correct), donc je voudrais créer ma propre copie, aussi parce que je veux apprendre à faire cela.

Alors, est-ce que quelqu'un sait ce que je dois faire et comment?

J'ai trouvé ce qui suit:

Je vais essayer, mais toute information supplémentaire serait bien aussi.

+0

Réfléchissez à deux fois avant de le faire, surtout avec vos assemblées « cœur ». Si ce n'est pas la caractéristique essentielle de votre code, il est préférable de charger dynamiquement ces assemblys.Dans le cas contraire, toute personne qui utilise un tel assembly devra faire quelques pas supplémentaires pour s'assurer qu'elle utilise la bonne version (x86 vs x64), même s'il n'utilise pas votre code non managé. Il est raisonnable pour vous exemple de 'System.Data.SQLite' (fonctionnalité essentielle) mais pourrait ne pas être raisonnable dans votre cas. – SergGr

Répondre

0

Avez-vous essayé d'exécuter le réflecteur sur System.Data.SQLite pour voir comment ils le font?

J'imagine que vous pourriez:

  • Inclure les 32 et 64 bits dll en tant que ressources dans un ensemble géré
  • Extrait le bon selon bitness quelque part
  • Appel SetDllDirectory() via PInvoke si nécessaire afin que windows puisse trouver la dll extraite
  • instancier une classe wrapper managée 32 ou 64 bits qui a des références à la dll

Cependant, étant donné que zlib est en C, vous pouvez également envelopper les appels dont vous avez besoin dans un assemblage CLR implémenté en C++ en utilisant la source zlib. Mais je ne suis pas sûr de la façon dont vous géreriez le bitness dans ce cas.

+0

cela est possible et gère à la fois les cas 32 et 64 bits. Ce n'est pas comme ça que ça se fait en sqlite. – vidstige

0

Rechercher mergebin de sqlite il devrait être ce que vous cherchez.

il peut fusionner à la fois les assemblages gérés et non gérés.

MS semble également avoir somthing à dire au sujet de l'utiliser here

+1

Le lien microsoft est complètement hors de propos. – vidstige