从经典ASP访问.NET程序集

我一直在尝试访问我在经典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): 用 另一个问题引用的.NET程序集替换旧的经典ASP COM组件 。 它提供了两种安装组件的方法,我尝试了两种方法,但无济于事。

让这项工作很棒,因为它可以让我逐步将经典的ASP站点迁移到.NET

另一件需要检查的事项是:确保您的.Net程序集设置为COM Visible。

在这里检查注册表:* HKLM \ SOFTWARE \ Classes *并查看namespace.class是否存在(例如“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 

此错误表示“无效的类字符串” – 换句话说,对CreateObject的调用失败,因为OLE子系统无法找到名称对象。 原因包括:

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

将匿名用户(由IIS使用)添加到Administrators组。 测试页然后工作,certificate这是一个权限问题。 不要忘记从Admin组中删除匿名IIS用户!

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

从Admin组中删除匿名用户后,将失败审核添加到文件(smtpsvg.dll),这将确定是否曾访问该文件(由于缺少失败事件)。 如果不是,则表明故障发生在文件访问之前,但请继续检查文件/目录权限以确保匿名IIS用户可以访问该文件。

  1. 检查注册表权限

使用Regedt32,在smtpsvg.dll上找到。 检查密钥(和子密​​钥)的权限,并确保匿名用户具有读取权限。 查找包含位置值和版本的class-id,并检查这些权限。

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

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

我必须做的事情之一是确保ASP站点的应用程序池使用与匿名用户相同的身份(默认情况下它使用“系统用户”或类似的东西)。 所以我最终创建了一个新的本地用户(确保它是IIS_WPG组的成员)并将其用于IIS匿名用户和App Pool身份。

这是一个麻烦的区域,我使用它的应用程序是一个收缩包装产品,我们发现一些机器搞砸了这样我们根本无法让ASP Classic到.net调用工作即使在批次之后调整权限等。

编辑:

我想我应该说我没有声称这个改变会解决这个特殊问题,只是这是我们必须做出的改变之一来制作ASP Classic – > .NET代码可以在各种随机客户服务器上运行。

我使用了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.xxx(或任何版本)文件夹,否则它将运行64位。