【问题标题】:Accessing a .NET Assembly from classic ASP从经典 ASP 访问 .NET 程序集
【发布时间】:2009-02-06 12:52:59
【问题描述】:

我一直在尝试访问我在经典 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):Replacing Old Classic ASP COM Components with .NET Assemblies,我从 another question 中引用了它。它提供了两种安装程序集的方法,我都尝试过,但都无济于事。

让这个工作很好,因为它可以让我逐渐将一个经典的 ASP 网站迁移到 .NET

【问题讨论】:

  • 你能发布一点你的程序集吗?特别是您导出的接口/类以及您在它们上拥有的属性。

标签: c# .net asp-classic assemblies


【解决方案1】:

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

【讨论】:

  • 您可以尝试在 ASP 之外首先在一个简单的 VBScript 文件中测试程序集以调试任何问题。创建脚本并使用 cscript.exe //X TestAssembly.vbs 进行调试。如果它可以在 VBScript 中运行,它也可以在 ASP 中运行,并且您可以隔离您的问题。
  • 原来这是问题所在。谢谢你。
【解决方案2】:

在此处检查注册表:*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

【讨论】:

    【解决方案3】:

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

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

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

    1. 判断是否是文件权限问题:

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

    1. 检查注册表权限

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

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

    【讨论】:

      【解决方案4】:

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

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

      不过,这是一个麻烦的地方,我使用它的应用程序是一个收缩包装的产品,我们发现一些机器被搞砸了,我们根本无法让 ASP Classic 调用 .net 工作即使经过大量的权限调整等等。

      编辑:

      我想我应该说我并不是说这个改变会解决这个特定的问题,只是这是我们必须做出的改变之一,以使 ASP Classic -> .NET 代码适用于广泛的随机客户服务器。

      【讨论】:

        【解决方案5】:

        我使用了 icepicker 的解决方案,它对我有用。我花了一天多的时间调查我遇到的这个错误

        Microsoft VBScript runtime error '800a01ad' 
        
        ActiveX component can't create object: 'namespace.class' 
        
        /page.asp, line 15
        

        解决方案是使用 c:\Windows\microsoft.net\framework64(folder of framework used)\regasm)。我从 c:\Windows\microsoft.net\framework64 & c:\Windows\microsoft.net\framework 运行它,但它不起作用。我的假设是,如果您运行 REGASM,它将默认为 32 位版本。除非您指定 framework64/v4.0.x.x.x(或任何版本)文件夹,否则它将运行 64 位。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-23
          • 1970-01-01
          • 1970-01-01
          • 2014-12-19
          • 2015-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多