TL;DR:为什么COM+组件会从成功激活。NET,但无法从ASP加载?
我的场景:
-
我已经使用C#/创建了一个COM+对象。NET(Framework 4.0(.
-
我正在使用Visual Studio安装程序项目将其部署到服务器上,该项目既将DLL安装到GAC,又将其注册到COM。
-
浏览
C:WindowsMicrosoft.NETassemblyGAC_MSIL
,我可以成功地找到我注册的DLL。 -
通过查看组件服务外接程序,我可以创建一个应用程序并添加我注册的组件。请注意,名称是不同的(DLL/namespace和ProgId之间(,这确实让我相信这两件事都正确发生了。
但是,我正在尝试从ASP Classic创建此COM的新实例。这意味着程序中有一条调用CCD_ 2的单行。,这就是投掷。
我已经做了以下工作:
- 我用一行
CreateObject("PROGID")
创建了一个VBS文件,并调用了它。它也失败了,所以问题不局限于ASP - 我使用了Powershell 2.0(机器上唯一可用的(,并调用了
New-Object -ComObject "PROGID"
,但它也失败了 - 我已经将LinqPad复制到机器上,并将
Type.GetTypeFromProgID
与Activator.CreateInstance
一起使用。我成功地调用了该实例
这个错误似乎很常见,是80070002。这应该表明COM找不到程序集文件。检查注册表后,我可以看到COM记录的程序集名称(FQ程序集名称(确实与我安装的程序集相对应。运行时是新的CLR(v4.0.30119(,类名也是正确的。
我完全被这件事难住了。NET可以在没有任何问题的情况下实例化COM对象,而VB6/ASP正在中止。
更糟糕的是,DLL上周已经成功部署,我只是在安装一个新版本,所以我应该有任何问题。
ASP和之间加载COM的方式有什么不同吗。NET可以导致这样的场景吗我在想什么:
- 任何必须设置但尚未设置的权限
- 任何的依赖项。NET DLL,从运行。NET,但没有从VBS运行
- 核心运行时版本对于ASP/VBS来说可能非常棒
最后一项应该是真的,因为我上周刚刚成功地完成了这项工作,并且我没有更改任何关于运行时的内容。
这似乎不是一个难以捉摸的问题。我仍然会在这里记录下来,因为有些人可能会在完全相同的情况下遇到这个问题,尽管这不太可能。
ASP、VBScript和PowerShell没有看到我应用的更改,并且由于某些原因找不到组件(80070002(的原因是必须重置IIS或完整的服务器关闭/重新启动周期。
导致我出现这种情况的原因既有服务器管理员忘记执行重置的事实,也有我没有考虑的事实。NET能够获取COM实例。
我不知道能解释为什么会这样的细节——也许吧。NET还没有跟踪程序集,无论运行COM的是什么(是的,我不知道,对不起(都已经跟踪了。当然,这种影响正在发生。
服务器的干净重新启动完全解决了这个问题。
最后一点——仅仅关闭Component Services
上的应用程序是不够的。