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

我有一台运行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创build对象时,我得到:

 Server object error 'ASP 0177 : 8000ffff' Server.CreateObject Failed /includes/a_URLFilter.asp, line 19 8000ffff 

当我在vbs脚本中创build对象并使用32位版本的cscript(在\ Windows \ syswow64)时,它工作正常。

我已经检查了DLL上的权限,并且IUSR具有Read / Execute。

即使我将IUSR添加到pipe理员组,我也会得到相同的错误。

这是来自ProcessMonitor筛选我的DLL的path(用我的行动注释)的日志:

 [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位窗口。 我想不出任何会使这个工作的东西。 有什么build议么?

更新>

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

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

  • 好吧,第一:32位是好的,但32位模式IIRC不适用于ASP,只适用于ASP.NET。
  • 因此,ASP(传统的ASP,这是你的URL表示)仍然是64位。
  • 而且你不能在64位的进程空间中加载一个32位的comOejct – 你就去了。 错误解释。

基本上我build议回去并在这里安装32位的操作系统,然后中期(ASAP)推出ASP.NET的ASP.NET。

几件事情检查:

  • 检查该.dll是否也在全局程序集caching中(不应该是)。 查看控制面板| 用于.NET Framework 2.0configuration的pipe理工具,可让您检查GAC
  • 程序集必须是强大的程序集(签名和所有)

看看MSDNregasm页面

另外,那个.dll没有被编译为64位,是吗? (只是为了排除显而易见的…)

是的,如果.NET DLLs被编译为64位忘记它:( 32位和64位模块不能在同一个进程中混合在一起(COM或没有COM)。

我试图做同样的事情,但与Win 7和IIS 7.5。 我最终能够通过使用REGASM的32位和64位版本来实现它的function,但无法准确跟踪哪一个版本可以使系统正常工作。