我们正在尝试编写几个应用程序。一个ASP.NET网站使用.NET程序集xxx.Elements.dll,该程序集提供实用函数。
另一个经典的ASP网站也应该使用相同的DLL以便使用相同的实用函数。(它将用于在两个站点之间加密数据)。
尽管我们做了很多尝试和搜索,但我们无法使其正常工作。
我们已经:
将ComVisibility应用于Assembly.info并确保有一个Guid:
我们确保我们的类型在类型可见性方面符合要求,通过确保它具有默认构造函数,是 ComVisible 并具有 Guid。我们还创建了一个简单的测试方法:
我们在这里找到了一篇非常有用的(虽然无法解决)文章,可以进行如下操作:警告 MSB3391:不包含任何可取消注册用于 COM 互操作的类型的 dll。 我们还检查了项目属性页面中的 COM-Interop 注册表。
这仍然会输出警告。
我们还在GAC中注册了该类型:
并使用以下方式为其命名:
我们还将IUSR用户的读取权限应用于注册表键:
当我们调试W3WP进程时,过程停止,并且出现以下错误:服务器对象:006~ASP 0177~Server.CreateObject Failed~800401f3。我们已经尝试勾选所有框,但似乎还是缺少了一些东西。请问您有什么想法吗?
另一个经典的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。我们已经尝试勾选所有框,但似乎还是缺少了一些东西。请问您有什么想法吗?