在ASP Classic中注册一个.NET DLL以使其对COM可见

5
我们正在尝试编写几个应用程序。一个ASP.NET网站使用.NET程序集xxx.Elements.dll,该程序集提供实用函数。
另一个经典的ASP网站也应该使用相同的DLL以便使用相同的实用函数。(它将用于在两个站点之间加密数据)。
尽管我们做了很多尝试和搜索,但我们无法使其正常工作。
我们已经:
将ComVisibility应用于Assembly.info并确保有一个Guid:
[assembly: ComVisible(true)]
[assembly: Guid("ab96fbc3-aa39-4fb6-8628-13778445e503")]

我们确保我们的类型在类型可见性方面符合要求,通过确保它具有默认构造函数,是 ComVisible 并具有 Guid。我们还创建了一个简单的测试方法:
namespace xxx.Elements
{
    [GuidAttribute("D3BE2C7D-7550-4da1-8F61-6871E193242F")]
    [ComVisible(true)]
    public  class UrlUtility : IUrlUtility
    {

        public UrlUtility()
        {
        }

        public string Test()
        {
            return "HellO";
        }

    }
}

使用界面:

[GuidAttribute("D3BE2C7D-7550-4da1-8F61-6871E193242A")]
[ComVisible(true)]
public interface IUrlUtility
{
    string Test();
}

我们在这里找到了一篇非常有用的(虽然无法解决)文章,可以进行如下操作:警告 MSB3391:不包含任何可取消注册用于 COM 互操作的类型的 dll。 我们还检查了项目属性页面中的 COM-Interop 注册表。
这仍然会输出警告。
c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3341,9): warning MSB3214: "D:\dev\yyy\xxx.Elements\bin\Release\xxx.Elements.dll" does not contain any types that can be registered for COM Interop.

在编译时,如果我们直接运行REGASM xxx.Elements.dll /tlb,会得到以下结果:

Microsoft (R) .NET Framework程序集注册实用工具 4.0.30319.1 版权所有(C) Microsoft Corporation 1998-2004。保留所有权利。 类型已成功注册 程序集已导出到“D:\dev\yyy\IWW.Elements\bin\release\xxx.eleme nts.tlb”,并且类型库已成功注册

因此有点困惑不确定。

当我们查看注册表时,它似乎确实正确地注册了.tlb:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}]

[HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}\1.1]
@="Elementary support library for xxx' products"

[HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}\1.1\0]

[HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}\1.1\0\win32]
@="D:\\dev\\yyy\\xxx.Elements\\bin\\Release\\xxx.Elements.tlb"

[HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}\1.1\FLAGS]
@="0"

[HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}\1.1\HELPDIR]
@="D:\\dev\\yyy\\xxx.Elements\\bin\\Release"

我们还在GAC中注册了该类型:
gacutil /i xxx.Elements.dll

并使用以下方式为其命名:
sn -k xxx.Elements.snk

并将名称包含在AssemblyInfo.cs文件中:

[assembly: AssemblyKeyFile(@"D:\dev\yyy\xxx.Elements\xxx.Elements.key")]

我们还将IUSR用户的读取权限应用于注册表键:
HKEY_CLASSES_ROOT\TypeLib\{AB96FBC3-AA39-4FB6-8628-13778445E503}
HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones

尽管如此,当我们在ASP页面中使用以下代码激活对象时:

(the last one was suggested here: Cannot instanciate .Net COM object in classic ASP/VBScript page (Error ASP 0177))

尽管如此,当我们在ASP页面中使用以下代码激活对象时:

dim urlUtility
set urlUtility = Server.CreateObject("xxx.Elements.UrlUtility")
' should return "Hello"
test=urlUtility.Test()

当我们调试W3WP进程时,过程停止,并且出现以下错误:服务器对象:006~ASP 0177~Server.CreateObject Failed~800401f3。我们已经尝试勾选所有框,但似乎还是缺少了一些东西。请问您有什么想法吗?

800401f3是“无效的类字符串”,不确定是否有帮助... - Nick
可能是正确的,但我们已经检查了注册表,它似乎与其他成功注册的DLL镜像相同,尤其是在CreateObject调用失败时。 - Mantidae
1个回答

0

我以前也遇到过类似的问题。我通过在COM+应用程序服务器中托管.NET组件来解决它。这篇文章提出并描述了同样的方法。除了文章之外,可能需要配置您的程序集(如果按照建议运行),此时您需要在应用程序根目录中使用清单和配置文件。请参考SO答案以获取详细信息。


谢谢,但这是为客户网站准备的,可能没有这种基础设施。我们会看一下它,看看它是否能给我们一些线索。 - Mantidae
您在客户端使用程序集时不需要进行COM+注册。这仅适用于在ASP Classic中安装相同程序集的服务器端安装。 - Dirk Brockhaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接