为什么我不能通过COM访问我的班级?

时间:2010-07-27 16:50:00

标签: c# com registration class-library

我有一个用C#.net编写的类库。我想在我的64位Windows机器上用COM注册它,这样我就可以在脚本(javascript,vbscript等)中使用CreateObject()创建它的实例。所以我创建了一个安装项目。我将安装项目的目标平台设置为x64。类库项目的Target平台是为AnyCPU设置的。我为安装程序创建了一个自定义操作,用于手动注册驱动程序,它看起来像这样......

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(this.GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
{           
   throw new InstallException("Failed To Register driver for COM Interop");
}

我可以在运行时将调试器附加到此进程,并确定此注册成功发生。

出于某种原因,当我尝试使用CreateObject()创建类的对象时,它给出了一个错误,上面写着“无法创建名为...的对象”。但是,如果我使用SysWOW64文件夹(32位文件夹)中的cscript.exe运行脚本,则会成功创建对象,并且我的其余脚本运行正常。因此,似乎该类已成功注册为32位但不是64位,或者我的项目具有32位依赖性,并且64位Cscript主机进程因为该依赖性而无法创建它。我的类库确实引用了我编写的另一个项目,但它也设置为为任何CPU构建。所以它应该适用于32位和64位进程。

有没有人对如何追踪这个32位依赖关系有任何建议?

1 个答案:

答案 0 :(得分:1)

使用RegisterAssembly()非常异常。这里可能出错的一件事是安装程序以32位模式运行。这会使RegisterAssembly()在错误的注册表部分注册COM服务器。

无需执行此操作,只需在安装项目中将文件的Register属性设置为COM。