Назад | Перейти на главную страницу

Ошибка Server.CreateObject при вызове объекта .Net из ASP в 64-разрядных окнах в 32-разрядном режиме IIS

У меня есть сервер под управлением 64-битной Windows 2003, на котором IIS работает в 32-битном режиме. У меня есть COM-объект, который был зарегистрирован с помощью следующей команды:

C:\WINDOWS\microsoft.net\Framework\v2.0.50727>regasm D:\Path\To\MyDll.dll /tlb:MyTLB.tlb /codebase

Когда я создаю объект через ASP, я получаю:

Server object error 'ASP 0177 : 8000ffff'

Server.CreateObject Failed

/includes/a_URLFilter.asp, line 19

8000ffff 

Когда я создаю объект в сценарии vbs и использую 32-разрядную версию cscript (в \ Windows \ syswow64), он работает нормально.

Я проверил разрешения на DLL, и IUSR имеет Read / Execute.

Даже если я добавлю IUSR в группу администраторов, я получаю ту же ошибку.

Это журнал фильтрации ProcessMonitor для пути к моей dll (помеченный моими действиями):

[Stop IIS]
1:56:30.0891918 PM  w3wp.exe    4088    CloseFile   D:\Path\To\MyDll.dll    SUCCESS 
[Start IIS]
[Refresh ASP page that uses DLL]
1:56:42.7825154 PM  w3wp.exe    2196    QueryOpen   D:\Path\To\MyDll.dll    SUCCESS CreationTime: 8/19/2009 1:11:17 PM, LastAccessTime: 8/19/2009 1:30:26 PM, LastWriteTime: 8/18/2009 12:09:33 PM, ChangeTime: 8/19/2009 1:22:02 PM, AllocationSize: 20,480, EndOfFile: 20,480, FileAttributes: A
1:56:42.7825972 PM  w3wp.exe    2196    QueryOpen   D:\Path\To\MyDll.dll    SUCCESS CreationTime: 8/19/2009 1:11:17 PM, LastAccessTime: 8/19/2009 1:30:26 PM, LastWriteTime: 8/18/2009 12:09:33 PM, ChangeTime: 8/19/2009 1:22:02 PM, AllocationSize: 20,480, EndOfFile: 20,480, FileAttributes: A
1:56:42.7826961 PM  w3wp.exe    2196    CreateFile  D:\Path\To\MyDll.dll    SUCCESS Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Delete, AllocationSize: n/a, Impersonating: SERVER2\IUSR_SERVER2, OpenResult: Opened
1:56:42.7827194 PM  w3wp.exe    2196    CreateFileMapping   D:\Path\To\MyDll.dll    SUCCESS SyncType: SyncTypeCreateSection, PageProtection: 
1:56:42.7827546 PM  w3wp.exe    2196    CreateFileMapping   D:\Path\To\MyDll.dll    SUCCESS SyncType: SyncTypeOther
1:56:42.7829130 PM  w3wp.exe    2196    Load Image  D:\Path\To\MyDll.dll    SUCCESS Image Base: 0x6350000, Image Size: 0x8000
1:56:42.7830590 PM  w3wp.exe    2196    Load Image  D:\Path\To\MyDll.dll    SUCCESS Image Base: 0x6360000, Image Size: 0x8000
1:56:42.7838855 PM  w3wp.exe    2196    CreateFile  D:\Webspace\SecurityDll\bin SUCCESS Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, Impersonating: SERVER2\IUSR_SERVER2, OpenResult: Opened
1:56:42.7839081 PM  w3wp.exe    2196    QueryDirectory  D:\Path\To\MyDll.INI    NO SUCH FILE    Filter: SecurityDll.INI
1:56:42.7839281 PM  w3wp.exe    2196    CloseFile   D:\Webspace\SecurityDll\bin SUCCESS 

[Refresh ASP page that uses DLL]
[Refresh ASP page that uses DLL]
[Refresh ASP page that uses DLL]

Эта dll отлично работает на других серверах, работающих под 32-битными окнами. Я не могу придумать ничего другого, что могло бы заставить эту работу работать. Какие-либо предложения?

ОБНОВЛЕНИЕ>

.Dll отсутствует в GAC, он скомпилирован как 32-разрядный и имеет надежную подпись.

Да, если .NET DLL скомпилированы для 64-разрядной версии, забудьте об этом :(. 32-разрядные и 64-разрядные модули не могут смешиваться вместе (COM или без COM) в одном процессе.

Пара вещей, которые нужно проверить:

  • Проверьте, есть ли эта библиотека .dll также в глобальном кеше сборок (ее не должно быть). Посмотрите в Панели управления | Инструменты администрирования для конфигурации .NET Framework 2.0, которые позволят вам проверить GAC
  • Сборка должна иметь строгое имя (подписанная и все такое).

Взгляните на страница regasm MSDN.

Кроме того, этот .dll не был скомпилирован для 64-разрядной версии, не так ли? (просто чтобы исключить очевидное ...)

Я пытался сделать то же самое, но с Win 7 и IIS 7.5. В конце концов я смог заставить его работать, используя как 32-битную, так и 64-битную версии REGASM, но не смог точно отследить, какая именно из них заставляла систему работать.

Вам, ребята, НУЖНО научиться читать - это не asp.net.

  • Хорошо, во-первых: 32-битный режим - это хорошо, но 32-битный режим IIRC НЕ для ASP, ТОЛЬКО для ASP.NET.
  • Таким образом, ASP (классический ASP, который указывает ваш URL-адрес) ВСЕГДА будет 64-битным.
  • И поскольку вы не можете загрузить 32-битный комм-объект в 64-битное пространство процесса - вот и все. Ошибка объяснена.

В основном я предлагаю вернуться и установить здесь 32-разрядную ОС, а затем в среднесрочной перспективе (как можно скорее) отказаться от ASP для ASP.NET.