我无法在COM中公开.NET程序集。似乎我必须缺少一些基本步骤,因为我认为我遵循了我发现的所有教程和文档以及常识,但仍然在我做的时候(在测试VBScript中):
Set o = CreateObject("MyLib.MyClass")
一直说无法创建对象。
以下是我所做的步骤:
为了确定,我尝试将库复制到与测试VBScript相同的目录,但它没有帮助。
编辑:我应该提到,如果我将DLL放入GAC,我可以在COM中实例化该类。
编辑:已解决。我没有完整的解释,但最终我发现它是由使用:
引起的%WINDIR%\ Microsoft.NET \框架\ V2.0.50727 \ RegAsm.exe
而不是64位版本:
%WINDIR%\ Microsoft.NET \ Framework64 \ V2.0.50727 \ RegAsm.exe
我比较了两个RegAsm的生成的注册表项,它们是相同的。所以猜测他们生成的东西比注册表键还要多。
答案 0 :(得分:2)
你应该添加几个属性:
for interface:
[Guid("4200ead6-8252-412c-8c7e-c3b586ac40d6")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
上课:
[Guid("9f718717-bc09-48f1-8ab1-00fa3abf4147")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyLib.MyClass")]
答案 1 :(得分:2)
是的,这是在64位操作系统上设计的。许多COM组件都是进程内DLL,仅作为32位DLL提供。 64位程序无法加载任何32位代码。为了防止它们发生故障,注册表被虚拟化;不同的程序对注册表有不同的看法。
32位程序实际上可以看到HKLM \ Software \ Wow6432 \ Classes中的键。 64位程序查看常规键。这会自动避免COM服务器意外。
.NET服务器不同寻常之处在于它们可以在32位和64位模式下运行,JIT编译器负责这一点。您通常应该执行的是两个版本的Regasm.exe。 Framework文件夹中的一个将为32位程序注册服务器,Framework64文件夹中的一个将其注册为64位程序。
答案 2 :(得分:1)
您可以使用Microsoft Fusion Logger http://msdn.microsoft.com/en-us/library/e74a18c4.aspx找出装配无法加载(或调用时绑定)的原因。
答案 3 :(得分:0)
我没有完整的解释,但最终我发现它是由使用:
引起的%windir%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe
而不是64位版本:
%windir%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe
我比较了两个RegAsm的生成的注册表项,它们是相同的。所以猜测他们生成的东西比注册表键还要多。