.NET COM+;对象可以';不能从ASP经典中使用

.NET COM+;对象可以';不能从ASP经典中使用,.net,asp-classic,com,.net,Asp Classic,Com,TL;DR:为什么COM+组件会从.NET成功激活,但无法从ASP加载 我的设想: 我使用C#/.NET(Framework 4.0)创建了一个COM+对象 我正在使用VisualStudio安装程序项目将其部署到服务器上,该项目既将DLL安装到GAC,也将其注册到COM 浏览C:\Windows\Microsoft.NET\assembly\GAC_MSIL,我可以成功找到我注册的DLL 通过查看组件服务外接程序,我可以创建一个应用程序并添加已注册的组件。请注意,名称不同(在DLL/命名空间

TL;DR:为什么COM+组件会从.NET成功激活,但无法从ASP加载

我的设想:

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

  • 我正在使用VisualStudio安装程序项目将其部署到服务器上,该项目既将DLL安装到GAC,也将其注册到COM

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

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

然而,我正在尝试从ASP Classic创建此COM的新实例。这意味着程序中有一行调用
CreateObject(“PROGID”)
,它正在抛出

我已经做了以下工作:

  • 我用一行代码创建了一个VBS文件,
    CreateObject(“PROGID”)
    ,并调用了它。它也会失败,因此问题不限于ASP
  • 我使用了Powershell 2.0(机器上唯一可用的一个),并调用了
    新对象-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来说可能太棒了

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

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

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


使我想到这个场景的是服务器管理员忘记执行重置-我没有考虑的事情,并且.NET<强> 能够获得COM实例。p> 我不知道具体的细节可以解释为什么会这样-也许.NET还没有跟踪程序集,运行COM的任何东西(是的,我不知道,对不起)都有。当然,这方面的事情正在发生

服务器的重新启动彻底解决了这个问题


最后一点-仅仅关闭组件服务上的应用程序是不够的

可能与经典的ASP问题有关的是权限问题,他们已经收紧了应用程序池与COM的交互方式。因此VBScript/Powershell测试可能失败,因为它们没有在提升的进程中运行(UAC再次攻击)。比特数是多少:32位对64位?@SimonMourier我需要再次检查,但我猜应用程序是32位。我正在将.NET组件编译为MSIL。如果使用c:\windows\SysWOW64\cscript.exe运行VB脚本,会发生什么情况?这样行吗?如果有效,则表示您已向32位配置单元注册了对象。vbscript文件的正常运行使用64位引擎完成。您的ASP引擎是64位还是32位?