代码之家  ›  专栏  ›  技术社区  ›  Bruno Brant

.NET COM+对象不能从ASP Classic使用

  •  2
  • Bruno Brant  · 技术社区  · 6 年前

    DR :为什么从.NET成功激活COM+组件,但从ASP加载失败?

    我的方案:

    • 我使用C/.NET(框架4.0)创建了一个COM+对象。

    • 我正在使用一个Visual Studio安装程序项目将其部署到服务器,该项目既将dll安装到GAC,也将其注册到COM。

    • 浏览 C:\Windows\Microsoft.NET\assembly\GAC_MSIL ,我可以成功找到我注册的dll。

    • 查看组件服务插件,我可以创建一个应用程序并添加我注册的组件。请注意,名称是不同的(在dll/命名空间和progid之间),这确实让我相信这两种情况都正确发生了。

    然而 ,我正在尝试从ASP Classic创建此COM的新实例。这意味着只有一个电话 CreateObject("PROGID") 在程序中,它正在抛出。

    我已经做了以下工作:

    • 我用一行代码创建了一个vbs文件, 创建对象(“ProgID”) 并称之为。它也失败了,所以这个问题不局限于ASP。
    • 我使用了PowerShell2.0(计算机上唯一可用的),并调用了 New-Object -ComObject "PROGID" 也失败了。
    • 我已经把linqpad复制到机器上并使用 Type.GetTypeFromProgID 一起 Activator.CreateInstance . 我成功地调用了实例。

    这个错误看起来很常见,是80070002。这应该表示COM找不到程序集文件。检查注册表后,我可以看到COM记录的程序集名称(FQ程序集名称)与我安装的程序集对应。运行时是新的clr(v4.0.30319),类名也正确。

    我完全困惑了 因为.NET可以在没有任何问题的情况下实例化COM对象,而vb6/asp正在中止。

    更糟的是,上周成功地部署了DLL,我只是安装了一个新版本,所以我应该会遇到任何问题。

    在ASP和.NET之间,COM的加载方式是否会导致这种情况? 我在想:

    • 必须设置但尚未设置的任何类型的权限。
    • 找到从.NET运行但从VBS运行的任何.NET dll的依赖项。
    • 核心运行时版本可能对ASP/VBS非常有用。

    最后一项应该是真的,因为我上周成功地完成了这项工作,并且没有更改任何关于运行时的内容。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Bruno Brant    6 年前

    这似乎不像看上去那样是个难以捉摸的问题。我仍然会在这里记录下来,因为有些人可能会在完全相同的情况下遇到这个问题,尽管这不太可能。

    ASP、VBScript和PowerShell没有看到我应用的更改,并且由于某种原因找不到组件(80070002)的原因是 需要重置IIS或完成服务器的关机/重新启动周期 .


    导致我出现这种情况的原因是服务器管理员 忘记 执行重置-这是我没有考虑到的-事实上.NET 能够获取COM实例。

    我不知道能解释为什么会这样的细节-也许.NET还没有隐藏程序集,不管运行COM的是什么(是的,我不知道,对不起),它都有。当然,正发生这样的事情。

    服务器重新启动完全解决了这个问题。

    最后一点-关闭上的应用程序 Component Services 还不够。