【问题标题】:Why can't I access my class through COM?为什么我不能通过 COM 访问我的班级?
【发布时间】:2010-07-28 01:05:29
【问题描述】:

我有一个用 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 位依赖有什么建议吗?

【问题讨论】:

    标签: c# com registration class-library


    【解决方案1】:

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

    不需要这样做,只需在安装项目中将文件的Register属性设置为COM即可。

    【讨论】:

    • 我在尝试 RegesterAssembly() 之前也这样做了。没有运气。
    • 使用 SysInternals 的 ProcMon 工具查看安装程序的实际作用。
    • 我已经尝试过了,但很难找到我想要的东西。关于我应该过滤什么的任何提示?
    • 查看正在写入的注册表项。如果它写入 HKLM\Software\Wow6432Node,你就会遇到问题,这是针对 32 位应用程序的。
    • 我发现使用 VS2010 而不是 VS2008 可以解决这个问题。如您所说,不需要手动注册。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-09-17
    • 2022-11-13
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多