Невозможно создать экземпляр объектов COM +, установленных через экспортированное приложение - PullRequest
1 голос
/ 28 февраля 2012

У меня есть приложение COM +, которое было экспортировано в MSI с использованием служб компонентов, а затем установлено на тестовом сервере. Веб-приложение (ASP) не может создать экземпляр объекта, который оно использует, из приложения COM +.

Приложение COM + состоит из трех DLL, встроенных в VB6. Существует одна DLL для данных, приложений и уровней представления. Веб-приложение использует только объекты из уровня представления. DLL-библиотеки COM + вызывают пару DLL-файлов .NET, предоставляемых через COM.

При запуске веб-приложения возвращается HTTP 500 - Internal Server Error. В приложении или системном журнале отсутствуют ошибки.

Я попытался создать экземпляр объекта из VBScript, используя WSH.CreateObject, и он работает только для объектов в слое данных. При попытке создать объект на уровне приложения или презентации я получаю следующую ошибку:

Error: Could not create object named "My.ProgId" 
Code: 800A801D
Source: WScript.CreateObject

Поскольку он не работает с VBScript, я подозреваю, что с приложением ASP все в порядке и проблемы возникают именно с приложением COM +.

Дополнительная информация

Если я удаляю приложение COM + и пытаюсь запустить мой VBScript для проверки его реализации, я получаю другую ошибку.

Error: Could not locate automation class named "My.ProgId" 
Code: 80020009
Source: WScript.CreateObject

Поскольку ошибки различаются, кажется, что COM, по крайней мере, находит объекты COM + при их установке, он просто не может их создать.

Я также пытался отслеживать сценарий с помощью ProcessMon. Я вижу WScript.exe (через COM), запрашивающий реестр для ProgID, а затем CLSID. В конце концов путь к DLL возвращается, а затем svchost.exe и dllhost.exe запрашивают в реестре ту же информацию, используя CLSID, а также возвращают путь к DLL. В конце концов DLL выполняет операцию Load Image против нее, за которой следует то же самое для msvbvm60.dll. Я не вижу ничего, что указывало бы на сбой доступа к COM + DLL.

Я сейчас попробовал установить приложение COM + на другой сервер Win2k3 и рабочий стол Windows XP. Я получаю тот же результат, имея возможность создавать экземпляры объектов из DLL уровня данных, но не из DLL уровня приложения и уровня представления. Я также попытался получить старую копию библиотеки прикладного уровня и Я смог успешно создать из нее объекты. Однако когда я сравниваю файлы проекта для двух разных версий, ничто не выделяется в качестве возможной причины этой проблемы.

1 Ответ

1 голос
/ 02 марта 2012

DLL прикладного уровня ссылалась на struct, определенный в сборке .NET.Ошибка была вызвана тем, что библиотека типов, содержащая struct, не зарегистрирована на компьютере развертывания.

При сборке сборки .NET в Visual Studio она создаст библиотеку типов для сборки и зарегистрирует ее.Когда приложение было развернуто, сборки .NET были зарегистрированы с использованием regasm /codebase <assemblyname.dll>.Это будет регистрировать классы, чтобы их можно было создавать, но не регистрировать никаких структур.

Решением было использование regtlib.exe для регистрации библиотеки типов на тестовом сервере.

Сообщения об ошибках вообще не помогали при поиске причины проблемы.Давай, Microsoft !!

...