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.
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. –
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. –
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). –