У меня есть приложение C #, использующее C ++ COM-объект, оба построены на 32-битной машине. Теперь мне нужно запустить их на 64-битной машине. Я зарегистрировал COM-объект. Соответствующая запись была создана в реестре компьютера \ hkey_classes_root \ wow6432node \ clsid {xxx}. Однако, когда я пытаюсь запустить приложение, оно сообщает, что | «Не удалось получить фабрику классов COM для компонента с CLSID {xxx} из-за следующей ошибки: 80040154.». Как я понял, код ошибки означает, что класс не зарегистрирован. Пожалуйста помоги!!! Спасибо
4 ответа
Первый ответ выше - правильный ответ. Вы не можете запустить ЦП ЛЮБОЕ целевое приложение в 64-битной Windows, если вы ссылаетесь на 32-битный COM-компонент. Он не загрузится.
Что происходит, так это то, что JIT видит ЦП ЛЮБОЙ и продвигает ваше приложение до 64-разрядного. Но 64-битной версии com control не существует, поэтому вы получаете незарегистрированную ошибку.
Это большая проблема для людей, использующих Microsoft Access для своих баз данных. 64-битной версии Access не существует, поэтому, когда они видят ошибку, они думают, что им нужна 64-битная среда выполнения (не существует). Вы должны пометить свое приложение как 32-битное только для того, чтобы использовать среду выполнения Access.
Это плохой выбор (IMHO) - найдите лучший компонент с 64-битной версией или используйте 100% управляемый код.
Мне не нравятся все приложения с тегами как 32-битные, только если они ДЕЙСТВИТЕЛЬНО не нуждаются в этом.
Я не думаю, что вы можете запускать 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
Среда выполнения .NET автоматически запускает приложение как 64-разрядное и больше не может загружать 32-разрядный компонент COM в свой процесс.
Это очень легко обойти, если COM-компонент имеет интерфейс, совместимый с автоматизацией. Создайте приложение COM + (Панель управления-> Администрирование-> Службы компонентов) и добавьте в него компонент. Таким образом вы принудительно создадите компонент в отдельном процессе и больше не будете заботиться о том, чтобы ваше клиентское приложение работало как 64-битное приложение.
Приложение C # могло быть скомпилировано с целью Any CPU, которая будет работать как в 64-битном режиме на машине x64. 64-битные процессы не могут получить доступ к 32-битным процессам.
В Visual Studio вы можете принудительно скомпилировать его как 32-разрядное приложение. Он находится в свойствах проекта, на вкладке «Сборка», в раскрывающемся списке «Целевая платформа». Установите его на x86
.
Могут быть и другие способы заставить его работать как 32-битное приложение, но я с ними не знаком.
Похожие вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.