在 IIS 32 位模式下从 64 位 Windows 上的 ASP 调用 .Net 对象时 Server.CreateObject 失败

在 IIS 32 位模式下从 64 位 Windows 上的 ASP 调用 .Net 对象时 Server.CreateObject 失败

我有一台运行 Windows 2003 64 位的服务器,该服务器以 32 位模式运行 IIS。我有一个使用以下命令注册的 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 具有读取/执行权限。

即使我将 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 位 Windows 的服务器上运行良好。我想不出还有什么其他方法可以让它工作。有什么建议吗?

更新>

.dll 不在 GAC 中,它被编译为 32 位,并且是强签名的。

答案1

你们需要学习阅读——这不是 asp.net。

  • 好的,首先:32 位很好,但 32 位模式 IIRC 不适用于 ASP,仅适用于 ASP.NET。
  • 因此,ASP(经典 ASP,即您的 URL 所表示的)仍然是 64 位。
  • 而且由于您无法在 64 位进程空间中加载 32 位 com oejct - 就是这样。错误解释。

基本上,我建议返回并在此安装 32 位操作系统,然后中期(尽快)淘汰 ASP 而使用 ASP.NET。

答案2

答案3

需要检查以下几件事:

  • 检查该 .dll 是否也在全局程序集缓存中(它不应该在)。查看控制面板 | .NET Framework 2.0 配置的管理工具,它将允许您检查 GAC
  • 该程序集必须是强命名程序集(已签名等)

看看regasm MSDN 页面

另外,那个 .dll 不是为 64 位编译的,是吗?(只是为了排除显而易见的情况......)

答案4

我尝试使用 Win 7 和 IIS 7.5 做同样的事情。我最终能够通过使用 32 位和 64 位版本的 REGASM 使其工作,但无法准确追踪哪个版本使系统工作。

相关内容