Длина указателя сборки взаимодействия - PullRequest
0 голосов
/ 06 декабря 2009

Почему Visual Studio иногда превращает ЖЕ параметры указателя в COM-библиотеках в uint, а иногда в ulong? У меня есть библиотека COM, которая имеет несколько методов с параметрами, такими как

[ in ] ULONG_PTR ParentWindow

Когда я ссылаюсь на эту библиотеку на моем настольном компьютере, сборка взаимодействия превращает ULONG_PTR в uint. Когда я делаю то же самое на своем ноутбуке, он превращается в ulong. Это вызывает проблемы при совместном использовании проекта между машинами. Я, вероятно, мог бы хранить сборку Interop в SVN вместе с остальной частью проекта, но это вызывает проблемы, если мне когда-либо понадобится восстановить его после обновления библиотеки COM, например.

Системы:

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 включен, а Visual Studio запущена от имени администратора.

Я попробую применить Visual Studio 2008 SP1 на ноутбуке на случай, если это окажет какое-либо влияние.

Редактировать: SP1 на ноутбуке без эффекта.

Обновление:

При добавлении ссылки на библиотеку COM в Visual Studio Process Monitor показывает devenv, считывающий файл COMLibrary.dll на настольном компьютере, в то время как он читает файл COMLibrary64.dll на ноутбуке. Это определенно является причиной, по которой на рабочем столе отображается указатель для указателей, в то время как ноутбук показывает в длину.

Теперь, почему он это делает? Процесс Devenv на обоих компьютерах выполняется под WoW64.

При запуске программы она использует COMLibrary64.dll на обоих компьютерах в соответствии с Process Monitor. Таким образом, проблема, кажется, только во время добавления ссылки.

Далее попробуем выполнить генерацию взаимодействия вручную.

1 Ответ

1 голос
/ 06 декабря 2009

Это точно тот же COM-сервер, а не 32 против 64-битных версий? То, что вы описываете, имеет все признаки нацеливания на разные битности, как вы, вероятно, знаете - ULONG_PTR - это 32 бита в 32-битных целях компиляции и 64 бита в 64-битных целях компиляции, но собственный код должен быть либо тем, либо другим во время компиляции .

Условный «правильный» перевод будет UIntPtr, но он будет зависеть в зависимости от того, в какой среде выполняется клиентский процесс .NET, а не от того, что требуется, битности COM-сервера.

...