.NET COM+ 对象不能用于 ASP 经典
.NET COM+ Object can't be used from ASP Classic
TL;DR:为什么从 .NET 成功激活 COM+ 组件但无法从 ASP 加载?
我的场景:
我使用 C#/.NET (Framework 4.0) 创建了一个 COM+ 对象。
我正在使用 Visual Studio 安装程序项目将其部署到服务器,该项目既将 DLL 安装到 GAC 又将其注册到 COM。
浏览C:\Windows\Microsoft.NET\assembly\GAC_MSIL
,我可以成功找到我注册的DLL。
查看组件服务加载项,我可以创建一个应用程序并添加我已注册的组件。请注意,名称不同(在 DLL/namespace 和 ProgId 之间),这确实让我相信这两件事都是正确发生的。
但是,我正在尝试从 ASP Classic 创建此 COM 的新实例。这意味着程序中有一行调用 CreateObject("PROGID")
,这是抛出。
我已经完成了以下操作:
- 我用一行
CreateObject("PROGID")
创建了一个 VBS 文件并调用了它。它也失败了,所以问题不限于 ASP.
- 我使用了 Powershell 2.0(机器上唯一可用的)并调用了
New-Object -ComObject "PROGID"
,它也失败了。
- 我已经将 LinqPad 复制到机器上并使用
Type.GetTypeFromProgID
和 Activator.CreateInstance
。我成功调用了实例。
这个错误似乎很常见,是 80070002。这应该表示 COM 找不到程序集文件。检查注册表后,我可以看到 COM 记录的程序集名称(FQ 程序集名称)确实与我安装的程序集相对应。运行时是新的 CLR (v4.0.30319),class 名称也正确。
我完全感到困惑 .NET 可以毫无问题地实例化 COM 对象,而 VB6/ASP 正在中止。
更糟糕的是,DLL 上周部署成功,我只是安装一个新版本,所以我应该有什么麻烦。
在 ASP 和 .NET 之间加载 COM 的方式是否有任何差异会导致这种情况? 我在想什么:
- 必须设置但尚未设置的任何类型的权限。
- 来自任何 .NET DLL 的依赖项,来自 .NET 的 运行,但来自 VBS 的 运行 未找到。
- 核心运行时版本可能非常适合 ASP/VBS。
最后一项应该是正确的,因为我上周才成功完成这项工作并且我没有更改任何关于运行时的内容。
看起来这似乎不是一个难以捉摸的问题。我仍然会在这里记录它,因为有些人可能 运行 在完全相同的情况下进入这个问题,尽管这不太可能。
ASP、VBScript 和 PowerShell 没有看到我应用的更改并且由于某种原因找不到组件 (80070002) 的原因是 IIS 重置或完整shutdown/restart 需要服务器周期。
导致我出现这种情况的原因是服务器管理员 忘记了 执行重置 - 我没有考虑到这一点 - 以及 .NET 是 能够获取 COM 实例。
我不知道可以解释为什么会这样的细节 - 也许 .NET 还没有隐藏程序集,而 运行s COM(是的,我不知道,抱歉)确实有.当然,类似的事情正在发生。
服务器干净重启完全解决了这个问题。
最后一点 - 仅在 Component Services
关闭应用程序是不够的。
TL;DR:为什么从 .NET 成功激活 COM+ 组件但无法从 ASP 加载?
我的场景:
我使用 C#/.NET (Framework 4.0) 创建了一个 COM+ 对象。
我正在使用 Visual Studio 安装程序项目将其部署到服务器,该项目既将 DLL 安装到 GAC 又将其注册到 COM。
浏览
C:\Windows\Microsoft.NET\assembly\GAC_MSIL
,我可以成功找到我注册的DLL。查看组件服务加载项,我可以创建一个应用程序并添加我已注册的组件。请注意,名称不同(在 DLL/namespace 和 ProgId 之间),这确实让我相信这两件事都是正确发生的。
但是,我正在尝试从 ASP Classic 创建此 COM 的新实例。这意味着程序中有一行调用 CreateObject("PROGID")
,这是抛出。
我已经完成了以下操作:
- 我用一行
CreateObject("PROGID")
创建了一个 VBS 文件并调用了它。它也失败了,所以问题不限于 ASP. - 我使用了 Powershell 2.0(机器上唯一可用的)并调用了
New-Object -ComObject "PROGID"
,它也失败了。 - 我已经将 LinqPad 复制到机器上并使用
Type.GetTypeFromProgID
和Activator.CreateInstance
。我成功调用了实例。
这个错误似乎很常见,是 80070002。这应该表示 COM 找不到程序集文件。检查注册表后,我可以看到 COM 记录的程序集名称(FQ 程序集名称)确实与我安装的程序集相对应。运行时是新的 CLR (v4.0.30319),class 名称也正确。
我完全感到困惑 .NET 可以毫无问题地实例化 COM 对象,而 VB6/ASP 正在中止。
更糟糕的是,DLL 上周部署成功,我只是安装一个新版本,所以我应该有什么麻烦。
在 ASP 和 .NET 之间加载 COM 的方式是否有任何差异会导致这种情况? 我在想什么:
- 必须设置但尚未设置的任何类型的权限。
- 来自任何 .NET DLL 的依赖项,来自 .NET 的 运行,但来自 VBS 的 运行 未找到。
- 核心运行时版本可能非常适合 ASP/VBS。
最后一项应该是正确的,因为我上周才成功完成这项工作并且我没有更改任何关于运行时的内容。
看起来这似乎不是一个难以捉摸的问题。我仍然会在这里记录它,因为有些人可能 运行 在完全相同的情况下进入这个问题,尽管这不太可能。
ASP、VBScript 和 PowerShell 没有看到我应用的更改并且由于某种原因找不到组件 (80070002) 的原因是 IIS 重置或完整shutdown/restart 需要服务器周期。
导致我出现这种情况的原因是服务器管理员 忘记了 执行重置 - 我没有考虑到这一点 - 以及 .NET 是 能够获取 COM 实例。
我不知道可以解释为什么会这样的细节 - 也许 .NET 还没有隐藏程序集,而 运行s COM(是的,我不知道,抱歉)确实有.当然,类似的事情正在发生。
服务器干净重启完全解决了这个问题。
最后一点 - 仅在 Component Services
关闭应用程序是不够的。