Доступ к сборке .NET из классического ASP

Я пытался получить доступ к сборке .NET, которую я создал в классическом ASP, используя

dim foo
set foo = Server.CreateObject("TestAssembly.MyClass")

Проблема в том, что я получаю сообщение об ошибке:

Server object error 'ASP 0177 : 800401f3'

Server.CreateObject Failed

/test.asp, line 4

Invalid class string

Я зарегистрировал сборку (TestAssembly.dll) с помощью gacutil и regasm, как указано в статье: Замена старого Классические компоненты ASP COM с сборками .NET, на которые я ссылался в еще вопрос. Он предоставляет два метода установки сборки, и я пробовал оба, но безрезультатно.

Было бы здорово, если бы это заработало, потому что это позволило бы мне постепенно перенести классический сайт ASP на .NET.


person Simon Hartcher    schedule 06.02.2009    source источник
comment
Можете выложить немного своей сборки? В частности, интерфейсы / классы, которые вы экспортируете, и атрибуты, которые у вас есть.   -  person JoshBerke    schedule 06.02.2009


Ответы (5)


Еще одна вещь, которую нужно проверить: убедитесь, что ваша сборка .Net настроена как COM Visible.

person brendan    schedule 06.02.2009
comment
Вы можете попробовать сначала протестировать сборку в простом файле VBScript вне ASP, чтобы отладить какие-либо проблемы. Создайте сценарий и используйте cscript.exe // X TestAssembly.vbs для отладки. Он будет работать в ASP, если он работает в VBScript, и вы можете изолировать свои проблемы. - person Ryan; 06.02.2009
comment
Оказывается, это была проблема. Спасибо за это. - person Simon Hartcher; 07.02.2009

Проверьте реестр здесь: * HKLM \ SOFTWARE \ Classes * и посмотрите, есть ли там namespace.class (например, «TestAssembly.MyClass») и есть ли в нем ключ под названием «CLSID» с действительным идентификатором.

Если записи в реестре нет, убедитесь, что в Проект> Свойства> Информация о сборке указано «Сделать сборку видимой для COM», а затем перекомпилируйте. После компиляции запустите regasm (если вы используете 64-битную машину, вам нужно будет явно указать 64-битную версию regasm - c: \ Windows \ microsoft.net \ framework64 \ v4.0.30319 \ regasm ) с участием:

regasm /codebase /tlb TestAssembly.dll
person icepicker    schedule 05.01.2011

Эта ошибка означает «Недопустимая строка класса» - другими словами, вызов CreateObject завершился неудачно, поскольку объект имени не может быть найден подсистемой OLE. Причины включают:

  1. В конце концов, вы действительно не запускали regsvr32 на сервере.
  2. Вы запустили regsvr32, но он сообщил об ошибке.
  3. Кто-то изменил систему безопасности в части реестра, которая не позволяет подсистеме OLE читать все или часть дерева HKEY_CLASSES_ROOT.
  4. Имя объекта, который вы пытаетесь создать, написано неправильно или неверно.
  5. Определите, не проблема ли это с разрешениями

Добавьте анонимного пользователя (используемого IIS) в группу администраторов. Затем тестовая страница заработала, доказав, что это проблема с разрешениями. Не забудьте удалить анонимного пользователя IIS из группы Admin!

  1. Определите, не связана ли проблема с правами доступа к файлам:

После удаления анонимного пользователя из группы администраторов добавьте в файл (smtpsvg.dll) аудит отказов, который определит, осуществлялся ли когда-либо доступ к файлу (по отсутствию события сбоя). Если это не так, это дает понять, что сбой произошел до доступа к файлу, но продолжайте и проверьте разрешения файла / каталога, чтобы убедиться, что анонимный пользователь IIS может получить доступ к файлу.

  1. Проверить разрешения реестра

Используя Regedt32, найдите smtpsvg.dll. Проверьте разрешения для ключа (и дополнительных ключей) и убедитесь, что анонимный пользователь имеет права на чтение. Найдите идентификатор класса, который содержит значение местоположения и версию, а также проверьте эти разрешения.

источник: http://forums.digitalpoint.com/showthread.php?t=21069 < / а>

person Chris Ballance    schedule 06.02.2009

В прошлом у меня были проблемы с вызовом сборок .NET из ASP Classic. Думаю, это была одна из нескольких проблем, с которыми я столкнулся на этом пути.

Одна из вещей, которые мне нужно было сделать, чтобы все заработало, - это убедиться, что пул приложений для сайта ASP использует тот же идентификатор, что и анонимный пользователь (по умолчанию он использует «Системный пользователь» или что-то в этом роде). В итоге я создал нового локального пользователя (убедившись, что он является членом группы IIS_WPG) и использовал его как для анонимного пользователя IIS, так и для удостоверения пула приложений.

Однако это проблемная область, приложение, для которого я его использовал, было упакованным в термоусадочную пленку продуктом, и мы обнаружили, что некоторые машины были облажались таким образом, что мы просто не могли заставить ASP Classic для вызовов .net работать даже после партии настройки разрешений и тому подобное.

Изменить:

Думаю, я должен сказать, что я не утверждаю, что это изменение решит эту конкретную проблему, просто это было одно из изменений, которые нам пришлось внести, чтобы код ASP Classic -> .NET работал на широком спектре серверов случайных клиентов. .

person andynormancx    schedule 06.02.2009

Я использовал решение icepicker, и оно у меня сработало. Я потратил больше дня на изучение этой ошибки, которую я получал

Microsoft VBScript runtime error '800a01ad' 

ActiveX component can't create object: 'namespace.class' 

/page.asp, line 15

Решением было использовать c: \ Windows \ microsoft.net \ framework64 (папка используемого фреймворка) \ regasm). Я запускал это из c: \ Windows \ microsoft.net \ framework64 и c: \ Windows \ microsoft.net \ framework, и это не сработало. Я предполагаю, что если вы запустите REGASM, по умолчанию будет установлена ​​32-битная версия. Если вы не укажете папку framework64 / v4.0.x.x.x (или любую другую версию), только тогда будет запущена 64-разрядная версия.

person biso    schedule 25.02.2013