在经典asp中找不到注册的COM+对象

本文关键字:COM+ 对象 注册 找不到 经典 asp | 更新日期: 2023-09-27 18:04:42

我使用c#在VS2008中创建了一个dll。它是使用。net Framework 2.0编译的。该项目是使用Visual c#/Windows下的Class Library模板创建的。我不知道这是否重要,但我正试图在经典asp和asp.net应用程序中使用生成的dll,而不是在桌面应用程序上。

这是通过采用现有的经典asp vbscript代码并用c#重写而创建的。我不是很有经验的创建娃娃,所以有很多仍然需要学习。我一直在网上搜索各种帮助创建这个dll。

这是我到目前为止所做的。

顶级类是这样设置的:

using System.Runtime.InteropServices;
using System.EnterpriseServices;
using System;
using System.Text;
using System.Web;
[assembly: ApplicationName("WebFramework")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false,
           AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]
namespace WebFramework
{
    [GuidAttribute("AACB678E-2C54-450A-873D-77A5A15BA0E5")]
    public class Framework : ServicedComponent
    {
        //Blah
    }
}

项目中的其他类都是公共的,它们都继承自类框架。我没有为那些类包含GuidAttribute指令,因为我不知道这是否必要。我确实需要它们公开,因为我将从我的经典asp/asp.net应用程序中引用它们。

在我编译了我的代码之后,我复制了三个文件;Inter.Scripting.dll、WebFramework.dll和WebFramework.dll。PDB到web服务器

web服务器是安装了IIS 7.5的Windows 2008 R2操作系统。

在服务器上的命令提示符中,我运行regsvcs程序,它安装了这个程序集并注册了dll,没有任何问题。命令窗口如下所示:

E:'inetpub'wwwroot'web'WebFramework>"C:'Windows'Microsoft.NET'Framework'v4.0.30319/regsvcs.exe" /appname:WebFramework /tlb:WebFramework.tlb WebFramework.dll
Microsoft (R) .NET Framework Services Installation Utility Version 4.0.30319.17929 Copyright (C) Microsoft Corporation.  All rights reserved.
Installed Assembly:
        Assembly: E:'inetpub'wwwroot'web'WebFramework'WebFramework.dll
        Application: WebFramework
        TypeLib: E:'inetpub'wwwroot'web'WebFramework'WebFramework.tlb

我检查了组件服务应用程序,在COM+应用程序下有一个WebFramework对象。我还运行regedit并搜索"WebFramework",它在Computer'HKEY_CLASSES_ROOT'WebFramework下找到了我的应用程序。

到目前为止我认为一切都是正确的....是吗?

当我使用以下代码运行测试经典asp页面时,我得到错误424 -需要对象

<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/vbscript">
        On Error Resume Next
        Dim WebFrame
        Set WebFrame = Server.CreateObject("WebFramework.Framework")
        Document.Write("<hr>")
        Document.Write(Err.Number)
        Document.Write(" - ")
        Document.Write(Err.Description)
        Document.Write("<br><hr>")
    </script>
</body>
</html>

我错过了什么?为什么asp页面找不到dll?

[编辑]还有一件事我忘了提。在"构建"选项卡上的"项目属性"页中,有一个注册COM互操作的复选框。

在经典asp中找不到注册的COM+对象

不要把注意力集中在COM组件上,试着把你的ASP代码改为有效的语法。

<html>
<head>
    <title></title>
</head>
<body>
    <%
    'This code will be processed server-side
    On Error Resume Next
    Dim WebFrame
    Set WebFrame = Server.CreateObject("WebFramework.Framework")
    'Do we have an error? Display it.
    If Err.Number <> 0 Then 
      Response.Write("<hr>")
      Response.Write(Err.Number)
      Response.Write(" - ")
      Response.Write(Err.Description)
      Response.Write("<br><hr>")
    End If
    %>
</body>
</html>

为什么出现Object Not Found错误?

如上所述,你的代码无效,为什么?

  1. 使用<script type="text/vbscript">标签(通常runat="server"需要使用<script>标签服务器端,但当你得到一个错误,表明它正在由ASP处理。在未来,我建议您使用<%%>来区分服务器端处理。

  2. 除非您在其他地方实例化它,否则没有这样的ASP对象称为Document。如果要我猜的话,我会说你想要输出到屏幕。使用内置的Response对象(服务器端请求由RequestResponse组成)。

我会说你的Object Not Found是由ASP不理解Document是什么引起的,因此引发了Object Not Found错误。


阅读你的评论后,我意识到你的代码被解释客户端,所以Document.Write不会导致Object Not Found错误,我认为现在的问题是Server.CreateObject,因为这是服务器端语法与客户端VBScript将不理解。

我要冒很大的风险,在我有一个解决方案之前回答这个问题。我认为我的问题与dll无关,而是与IIS和这个新的web服务器如何设置有关。

我在这里问了另一个问题:让IIS 7.5与经典ASP一起工作,这是关于正确设置服务器和IIS的。

到目前为止还没有运气,但是如果我甚至不能得到一个简单的客户端Hello World脚本来在网页上显示Hello World,那么我怎么能想到我可以在那里创建一个dll对象。

如果我解决了第一个问题,我仍然有使用dll的问题,然后我会回到这个,再试一次。