从经典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子系统无法找到名称对象。 原因包括:
- 毕竟你真的没有在服务器上运行regsvr32。
- 您运行了regsvr32但它报告了一个错误。
- 有人修改了部分注册表的安全性,阻止OLE子系统读取全部或部分HKEY_CLASSES_ROOT树。
- 您尝试创建的对象的名称拼写错误或不正确。
- 确定它是否是权限问题
将匿名用户(由IIS使用)添加到Administrators组。 测试页然后工作,certificate这是一个权限问题。 不要忘记从Admin组中删除匿名IIS用户!
- 确定它是否是文件权限问题:
从Admin组中删除匿名用户后,将失败审核添加到文件(smtpsvg.dll),这将确定是否曾访问该文件(由于缺少失败事件)。 如果不是,则表明故障发生在文件访问之前,但请继续检查文件/目录权限以确保匿名IIS用户可以访问该文件。
- 检查注册表权限
使用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 \ framework64 & c:\ Windows \ microsoft.net \ framework运行它,它不起作用。 我的假设是,如果你运行REGASM,它将默认为32位版本。 除非您指定framework64 / v4.0.xxx(或任何版本)文件夹,否则它将运行64位。