Запуск 32-битного приложения с использованием 32-битного com на 64-битной машине с Windows - PullRequest
3 голосов
/ 10 июня 2009

У меня есть приложение C #, использующее COM-объект C ++, оба построены на 32-битной машине. Теперь я должен запустить их на 64-битной машине. Я зарегистрировал объект COM. Соответствующая запись была создана в реестре в папке computer \ hkey_classes_root \ wow6432node \ clsid {xxx}. Тем не менее, когда я пытаюсь запустить приложение, он говорит, что | «Получение фабрики COM-класса для компонента с CLSID {xxx} не удалось из-за следующей ошибки: 80040154.». Как я понимаю, код ошибки означает, что класс не зарегистрирован. Пожалуйста помоги!!! Спасибо

Ответы [ 4 ]

4 голосов
/ 10 июня 2009

Первый ответ выше является правильным ответом. Вы не можете запустить ЛЮБОЕ целевое приложение ЦП в 64-битной Windows, если вы ссылаетесь на 32-битный COM-компонент. Это не будет загружаться.

То, что происходит, - то, что JIT видит ЦП ЛЮБОЙ и продвигает ваше приложение до 64 бит. Но нет 64-битной версии элемента управления com, поэтому вы получаете незарегистрированную ошибку.

Это большая проблема для людей, которые используют Microsoft Access для своей базы данных. 64-разрядная версия Access отсутствует, поэтому, когда они видят ошибку, они думают, что им требуется 64-разрядная среда выполнения (не существует). Вы должны отметить свое приложение как 32-битное только для того, чтобы использовать среду выполнения Access.

Это плохой выбор (ИМХО) - найдите лучший компонент с 64-битной версией или используйте 100% управляемый код.

Я не люблю, чтобы все приложения тегов были только 32-битными, если они ДЕЙСТВИТЕЛЬНО не нужны.

2 голосов
/ 10 июня 2009

.NET. Среда выполнения автоматически запускает приложение как 64-разрядное, и оно больше не может загружать 32-разрядный компонент COM в свой процесс.

Это очень легко обойти, если COM-компонент имеет интерфейс, совместимый с Automation. Создайте приложение COM + (Панель управления-> Администрирование-> Службы компонентов) и добавьте в него компонент. Таким образом, вы принудительно создадите компонент в отдельном процессе и вам больше не нужно заботиться о том, чтобы ваше клиентское приложение выполнялось как 64-разрядное приложение.

2 голосов
/ 10 июня 2009

Приложение C # может быть скомпилировано с целью Any CPU, которая будет работать в 64-битном режиме на компьютере x64. 64-разрядные процессы не могут получить доступ к 32-разрядным процессам.

В Visual Studio вы можете принудительно скомпилировать его как 32-разрядное приложение. Он находится в свойствах проекта, вкладка «Сборка», раскрывающийся список целей платформы. Установите x86.

Могут быть и другие способы заставить его работать как 32-битное приложение, но я не знаком с ними.

0 голосов
/ 10 июня 2009

Я не думаю, что вы можете запустить 32-битное приложение на 64-битной машине. Вам нужно скомпилировать ваше приложение как 64-битный двоичный файл или запустить его под эмулятором (например, WOW64 в Windows). Если ваше приложение (сборка в 64-битном бинарном файле) использует какие-либо внешние библиотеки DLL, вам также потребуется 64-битная версия всех этих библиотек.

Вот хорошая ссылка:

http://searchwindowsserver.techtarget.com/tip/0,289483,sid68_gci1220022,00.html

Edit:

Если вы перейдете в Свойства вашего проекта -> Построить, измените Цель платформы с «Любой процессор» на X86. Посмотрите, поможет ли это.

Или вам нужно зарегистрировать свои dll: http://riteshk.blogspot.com/2007/05/retrieving-com-class-factory-failed-due.html

...