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

3
Vicky 10 Июн 2009 в 00:24

4 ответа

Лучший ответ

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

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

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

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

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

4
Roger Lipscombe 4 Янв 2010 в 15:45

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

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

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

Редактировать:

Если вы перейдете в «Свойства проекта» -> «Сборка», измените платформу Target с «Any CPU» на X86. Посмотрим, поможет ли это.

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

0
David 9 Июн 2009 в 20:54

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

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

2
sharptooth 10 Июн 2009 в 06:32

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

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

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

2
Powerlord 9 Июн 2009 в 20:39