从经典ASP访问.NET程序集

7

我一直在尝试使用经典ASP访问我创建的.NET程序集

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

问题是我遇到了一个错误:
Server object error 'ASP 0177 : 800401f3'

Server.CreateObject Failed

/test.asp, line 4

Invalid class string

我已经按照这篇文章中提到的指示,使用gacutil和regasm注册了程序集(TestAssembly.dll)。我是从另一个问题中引用了它。它提供了两种安装程序集的方法,我都尝试过,但没有成功。
如果能让它正常工作就太好了,因为这将使我逐步将一个经典的ASP站点迁移到.NET。

你能发一下你的汇编代码吗?具体来说,是你正在导出的接口/类以及它们上面的属性。 - JoshBerke
5个回答

3

还有一件要检查的事情:确保你的.Net程序集已设置为COM可见。


你可以尝试在 ASP 之外先使用简单的 VBScript 文件测试汇编代码,以便调试任何问题。创建一个脚本并使用 cscript.exe //X TestAssembly.vbs 进行调试。如果在 VBScript 中运行正常,那么它也会在 ASP 中正常工作,并且您可以隔离问题。 - Ryan
原来是这个问题。谢谢你。 - Simon Hartcher

3
在注册表中检查此处的内容:*HKLM\SOFTWARE\Classes*,查看命名空间类是否存在(例如“TestAssembly.MyClass”),并且它具有一个称为“CLSID”的键和有效的ID。
如果注册表条目不存在,请确保 Project > Properties > Assembly Information 具有"Make assembly COM-Visible",然后重新编译。 编译完成后,运行 regasm(如果您使用的是 64 位机器,则必须显式引用 64 位版本的 regasm - c:\Windows\microsoft.net\framework64\v4.0.30319\regasm),并输入以下内容:
regasm /codebase /tlb TestAssembly.dll

0

这个错误意味着“无效的类字符串”——换句话说,调用CreateObject失败,因为OLE子系统找不到对象名称。原因包括:

  1. 你真的没有在服务器上运行regsvr32。
  2. 你运行了regsvr32,但它报告了一个错误。
  3. 有人修改了注册表的一部分安全设置,阻止OLE子系统读取HKEY_CLASSES_ROOT树的全部或部分内容。
  4. 你尝试创建的对象名称拼写错误或不正确。
  5. 确定是否是权限问题。

将匿名用户(由IIS使用)添加到管理员组中。测试页面随后可以工作,证明这是一个权限问题。不要忘记从Admin组中删除匿名IIS用户!

  1. 确定是否是文件权限问题:

从Admin组中删除匿名用户后,将故障审计添加到文件(smtpsvg.dll),这将确定文件是否被访问过(通过缺少故障事件)。如果没有,这就清楚地表明故障发生在文件访问之前,但请检查文件/目录权限,以确保匿名IIS用户可以访问该文件。

  • 检查注册表权限
  • 使用Regedt32,在smtpsvg.dll上进行查找。检查该键(和子键)的权限,并确保匿名用户具有读取权限。在包含位置值和版本的class-id上进行查找,并检查这些权限。

    来源:http://forums.digitalpoint.com/showthread.php?t=21069


    0

    我过去在从ASP Classic调用.NET程序集时遇到了问题。我认为这是我一路上遇到的几个问题之一。

    为了使事情正常工作,我必须做的一件事是确保ASP站点的应用程序池使用与匿名用户相同的标识(默认情况下使用“系统用户”或类似名称)。因此,我最终创建了一个新的本地用户(确保它是IIS_WPG组的成员),并将其用于IIS匿名用户和应用程序池标识。

    尽管如此,这仍然是一个麻烦的领域。我使用它的应用程序是一个收缩包产品,我们发现有些机器出现了问题,即使经过了许多权限调整等操作,我们仍然无法使ASP Classic对.NET调用正常工作。

    编辑:

    我想我应该说的是,我并不是声称这种更改会解决这个特定的问题,只是这是我们不得不进行的更改之一,以使我们的ASP Classic -> .NET代码在各种随机客户服务器上正常工作。


    0

    我使用了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\framework64c:\Windows\microsoft.net\framework上运行它,但它没有起作用。我的假设是,如果您运行REGASM,它将默认为32位版本。除非您指定framework64/v4.0.x.x.x(或任何版本)文件夹,否则它将仅运行64位。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接