Запуск 32-разрядного приложения с использованием 32-разрядного com на 64-разрядном компьютере с Windows
Вопрос
У меня есть приложение на C #, использующее COM-объект C ++, оба построены на 32-разрядной машине.Теперь я должен запустить их на 64-битной машине.Я зарегистрировал COM-объект.Соответствующая запись была создана в реестре в разделе computer\□\wow6432node\clsid{xxx}.Однако, когда я пытаюсь запустить приложение, оно сообщает, что |"Не удалось получить фабрику COM-класса для компонента с CLSID {xxx} из-за следующей ошибки:80040154.".Как я понимаю, код ошибки означает, что класс не зарегистрирован.Пожалуйста, помогите!!!Спасибо
Решение
Первый ответ выше - это правильный ответ.Вы не сможете запустить процессор ЛЮБОГО целевого приложения в 64-разрядной Windows, если вы ссылаетесь на 32-разрядный COM-компонент.Он не будет загружаться.
Что происходит, так это то, что JIT видит CPU ANY и переводит ваше приложение на 64-разрядную версию.Но нет 64-разрядной версии com-элемента управления, и, следовательно, вы получаете ошибку not registered.
Это большая проблема для людей, которые используют Microsoft Access для своей базы данных.64-разрядной версии Access не существует, поэтому, когда они видят ошибку, они думают, что им нужна 64-разрядная среда выполнения (не существует).Вы должны пометить свое приложение как 32-разрядное только для того, чтобы использовать среду выполнения Access.
Это плохой выбор (ИМХО) - найдите лучший компонент с 64-разрядной версией или используйте 100% управляемый код.
Мне не нравится помечать все приложения как 32-разрядные только в том случае, если им это ДЕЙСТВИТЕЛЬНО не нужно.
Другие советы
Приложение C #, возможно, было скомпилировано с любым целевым процессором, который будет работать как в 64-разрядном режиме на компьютере x64.64-разрядные процессы не могут получить доступ к 32-разрядным процессам.
В Visual Studio вы можете принудительно скомпилировать его как 32-разрядное приложение.Это находится в раскрывающемся списке Свойства проекта, вкладка Сборка, Целевая платформа.Установите его на x86
.
Могут быть и другие способы заставить его работать как 32-разрядное приложение, но я с ними не знаком.
Среда выполнения .NET автоматически запускает приложение как 64-разрядное, и оно больше не может загружать 32-разрядный COM-компонент в свой процесс.
Это очень легко обойти, если COM-компонент имеет интерфейс, совместимый с автоматизацией.Создайте приложение COM+ (Панель управления-> Административные инструменты-> Службы компонентов) и добавьте в него компонент.Таким образом, вы принудительно создадите компонент в отдельном процессе, и вам больше не будет важно, чтобы ваше клиентское приложение работало как 64-разрядное.
Я не думаю, что вы можете запустить 32-разрядное приложение изначально на 64-разрядной машине.Вам нужно скомпилировать свое приложение в виде 64-битного двоичного файла или запустить его под эмулятором (например, WOW64 в Windows).Если ваше приложение (построенное в 64-битном двоичном формате) использует какие-либо внешние библиотеки dll, вам также понадобится 64-битная версия всех этих библиотек DLL.
Вот хорошая ссылка:
http://searchwindowsserver.techtarget.com/tip/0 ,289483,sid68_gci1220022,00.html
Редактировать:
Если вы перейдете в Свойства вашего проекта -> Сборка, измените целевую платформу с "Любой процессор" на X86.Посмотрим, поможет ли это.
Или вам нужно зарегистрировать свои библиотеки dll: http://riteshk.blogspot.com/2007/05/retrieving-com-class-factory-failed-due.html