Используйте сборку .NET с классической страницы ASP.

У меня есть старый веб-сайт .net 2005, на котором есть несколько страниц asp и проблема со ссылкой на объект при доступе к .net dll. Задача обслуживания была передана мне, и оригинального разработчика нигде не найти :( Я уже начал работать в .Net, поэтому я действительно не умею справляться с этой адской проблемой dll.

На стрелке ниже показано, где я обращаюсь к «(0x80131500) Ссылка на объект не указывает на экземпляр объекта».

Set objCommon = Server.CreateObject("Wrapper.CommonFunctions")
  Dim machineBuilding
--->>>  If objCommon.IsMachineAccount(strLogin, machineBuilding) Then

Я уже выполнил следующие шаги:

  1. regasm /tbl /codebase mycomdll.dll
  2. gacutil /i mycomdll.dll
  3. скопируйте mycomdll.dll в каталог System32
  4. В консоли выполните issreset
  5. Если ваша dll создается в среде 2.0, создайте файл «dllhost.exe.config» в каталоге system32 и поместите это:

<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v2.0.50727"/> <requiredRuntime version="v2.0.50727"/> </startup> </configuration>

6.- Перезапустите IIS с помощью команды issreset

а еще вот эти:

  1. В свойствах проекта a. В разделе \application\assembly information i. Установите флажок «Сделать сборку Com-видимой». б. В стадии сборки i. Установите флажок «Зарегистрироваться для Com Interop».
  2. НЕ ПОДПИСЫВАЙТЕ его.
  3. Убедитесь, что IUSR имеет полные права доступа к файлу.
  4. Перезапустите IIS через iisreset, чтобы очистить кэши.

И все еще не удалось запустить приложение. Есть еще идеи, что проверить или сделать? Спасибо!

Эмир


person Emirage    schedule 12.08.2010    source источник
comment
У меня было классическое приложение ASP, которое использовало сборку .NET через оболочку COM, и код Classic ASP был похож на ваш. Вы убедились, что инициализированы strLogin и machineBuilding? Вы выполнили objCommon.IsMachineAccount с другого клиента, чтобы убедиться, что сам вызов не вызывает ошибку?   -  person Mayo    schedule 12.08.2010
comment
Спасибо Майо. Я попытался подключиться к dllhost и могу отлаживать коды asp. Да, strLogin имеет значение моего сетевого идентификатора; машиностроение получит значение от звонка. Я не думаю, что есть проблема с кодами asp, так как у нас есть рабочая версия на рабочем сервере. Но мне нужно, чтобы исходный код работал правильно на моем локальном компьютере, прежде чем я смогу делать запросы на изменение.   -  person Emirage    schedule 13.08.2010


Ответы (3)


Значение HRESULT очень актуально. Обратите внимание на «код объекта» в 0x80131500, где 13 указывает, что источником ошибки является управляемый код. Вы уже получили дружественный перевод за 1500.

Другими словами, управляемый код выдал исключение, которое не было обработано. Конечно, это не редкость, управляемый код очень часто генерирует исключения. Особенно NullReferenceException, которое вы вызвали. Отладить это не так просто, поскольку вы запускаете управляемый код в неуправляемом процессе. Не совсем уверен, какова правильная процедура для IIS, обычно это делается с помощью Tools + Attach to Process. Лучший способ решить эту проблему — изолировать код, написать несколько модульных тестов.

Кроме этого, переменная MachineBuilding кажется мне хорошим кандидатом на NRE. Вы его не инициализировали.

Кстати: это не имеет ничего общего с регистрацией. Это приводит к ошибке совсем другого рода.

person Hans Passant    schedule 12.08.2010
comment
Мне никогда не приходило в голову, что информацию в HRESULT можно разбить, чтобы изолировать ошибку (вместо сопоставления конкретной ошибки с конкретной проблемой). +1 просто за то, что показал мне что-то новое. Кроме того, если у вас есть какие-либо ссылки, которые дают больше информации об интерпретации HRESULT, это было бы здорово. - person Mayo; 13.08.2010
comment
Информация найдена по адресу blogs.msdn.com/b/heaths. /архив/2005/07/21/441391.aspx. Средство (биты 8-15 равны 19) — это FACILITY_URT, которое, как я позже обнаружил, означает Universal Runtime, раннее название CLR. Очень интересно - люблю узнавать новое. :) - person Mayo; 13.08.2010
comment
@Mayo: посмотрите в заголовочном файле SDK WinError.h множество подробностей об этом. c:\program files\microsoft sdks\windows\v6.0a\include для vs2008. - person Hans Passant; 13.08.2010

У меня было решение, похожее на ваше, но оно давно ушло. Однако у меня все еще есть некоторая информация об этом, и я заметил, что мое заявление о регазме отличается.

regasm mycomdll.dll /tlb :mycomdll.tlb

Ваши ссылки tbl вместо tlb - может быть, проблема в этом?

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

Я также хочу подтвердить, что мой классический код ASP совпадает с вашим...

set obj = server.CreateObject("mycomdll.myclass")
...
call obj.method(false)
...
myvar = obj.method2(param1, param2, param3)
person Mayo    schedule 12.08.2010

Проблема заключалась в том, что приложение ищет файл, содержащий имя хоста базы данных.

person Emirage    schedule 01.09.2010