2009-12-05 3 views
0

Pourquoi Visual Studio transforme parfois les paramètres du pointeur SAME dans les bibliothèques COM en uint et parfois en ulong? J'ai une bibliothèque COM qui a des méthodes avec des paramètres tels queLongueur du pointeur d'assembly Interop

[ in ] ULONG_PTR ParentWindow 

Quand je référence cette bibliothèque sur mon ordinateur de bureau, l'ensemble de l'Interop se ULONG_PTR en uint. Quand je fais la même chose sur mon ordinateur portable, il est transformé en ulong. Cela provoque des problèmes lors du partage du projet entre les machines. Je pourrais probablement stocker l'assembly Interop dans SVN avec le reste du projet, mais cela pose des problèmes si jamais j'ai besoin de le régénérer après avoir mis à jour la bibliothèque COM par exemple.

Les systèmes sont les suivants:

 
Desktop        Laptop 
- Windows Vista Professional 64-bit - Windows 7 Ultimate 64-bit 
- Visual Studio 2008 Professional  - Visual Studio 2008 Team System 
    (SP1)         Development Edition (SP1) 
- .Net Framework 3.5 SP1    - .Net Framework 3.5 SP1 

UAC est activé et Visual Studio est exécuté en tant qu'administrateur.

Je vais essayer d'appliquer Visual Studio 2008 SP1 sur l'ordinateur portable au cas où cela aurait un effet.

Modifier: Appliqué SP1 sur un ordinateur portable sans effet.

Mise à jour:

Lorsque vous ajoutez la référence à la bibliothèque COM dans Visual Studio, Process Monitor montre devenv lecture COMLibrary.dll sur l'ordinateur de bureau pendant qu'il lit COMLibrary64.dll sur un ordinateur portable. C'est certainement la raison pour laquelle le bureau affiche uint pour les pointeurs alors que l'ordinateur portable montre ulong.

Maintenant, pourquoi fait-il cela? Le processus Devenv sur les deux ordinateurs s'exécute sous WoW64. Lors de l'exécution du programme, il utilise COMLibrary64.dll sur les deux ordinateurs selon Process Monitor. Donc, le problème semble être seulement lors de l'ajout de référence.

Essayera de faire la génération interop manuellement ensuite.

Répondre

1

Est-ce définitivement le même serveur COM, et non 32 versions 64 bits? Ce que vous décrivez a toutes les caractéristiques de cibler différentes bitness, comme vous le savez probablement - ULONG_PTR est 32 bits dans les cibles de compilation 32 bits et 64 bits dans les cibles de compilation 64 bits, mais le code natif doit être l'un ou l'autre au moment de la compilation .

La traduction «correcte» théorique serait UIntPtr, mais cela flotterait en fonction de la structure du processus client .NET, plutôt que de ce qui est requis, de la quantité de bits du serveur COM.

+0

Oui, il semble vraiment que la différence vient des versions 32 vs 64 bits. Mis à jour le post original légèrement maintenant que j'ai compris comment confirmer cela. Je n'ai toujours aucune idée de pourquoi la différence. –

+0

Oh, et je pense que (U) IntPtr serait correct dans tous les cas. Ces paramètres sont pour la plupart des poignées de fenêtre et au moins les contrôles WinForms exposent la propriété Handle comme IntPtr. Maintenant j'ai juste besoin de comprendre comment le dire à tlbimp. –

+0

COM est une norme binaire. L'interface COM ne peut pas flotter entre 32 bits et 64 bits selon le framework .NET utilisé pour l'exécuter, mais le code .NET le fera. Vous ne devez utiliser U/IntPtr que si votre exécutable est fixé à l'un ou à l'autre (c'est-à-dire non à AnyCPU). –