什么是JACOB库的有效COM结构?

时间:2016-04-14 16:53:16

标签: java c# dll com jacob

我正在使用JACOB(Java COM Bridge)库从我的Windows操作系统调用已注册的COM对象。 我花了一段时间才弄清楚JACOB的工作方式和设置方法。所以我目前的问题是:

ActiveXComponent comp = new ActiveXComponent("iTunes.Application"); 

例如有效,我的iTunes正常启动等。 如果我想调用用C#编写的自生成和注册的COM对象,JACOB会响应以下错误:

Exception in thread "main" com.jacob.com.ComFailException: Can't co-create object

我的iTunes启动对我来说是一个指示,一切都设置正确,我不知道为什么JACOB不能调用我自己的.dll

目前我在构建寄存器上使用Visual Studio 2015来实现COM互操作功能,这在过去对我来说非常好。 COM对象如下所示:

[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface ComClass1Interface
{
}

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ComClass1Events
{
}

[ComVisible(true)]
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ComClass1Events))]
[ProgId("test.Application")]
public class ComClass1 : ComClass1Interface
{
}

我的C#dll有什么问题,或者JACOB在这个dll中是否需要某种类型的结构?

不幸的是我找不到JACOB的任何COM示例。

提前致谢。

编辑:

如果我将第一行更改为:

ActiveXComponent comp = new ActiveXComponent("CLSID:{C9888A8E-8D23-4185-9D7D-A1E0B812803D}");

我正在接受以下例外:

Exception in thread "main" com.jacob.com.ComFailException: Can't find moniker

我的.dll应该注册。

2 个答案:

答案 0 :(得分:1)

我首先编写一个VBS(VB脚本)程序来测试你的DLL,并确保它运行。

set obj = CreateObject("test.application")
MsgBox TypeName(obj)

确保成功。如果失败,那么(假设是64位操作系统),尝试使用c:\​​ windows \ syswow64 \ wscript.exe path \ to \ your \ script.vbs运行它。

检查您的Java进程是64位还是32位进程。您的C#DLL必须使用与Java进程相同的位来注册才能成功。

答案 1 :(得分:1)

感谢您的提示,我找到了解决方案:

Visual Studio显然将我的COM-Object注册为32位。 我不确定这是否是默认设置(?)。

解决问题的两个简单步骤:

  1. 以管理员身份打开您的Windows cmd。
  2. 运行以下命令:

    C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ RegAsm.exe / verbose / nologo / codebase"您的dll路径"

  3. 该命令将64位注册.dll而不是32位。 这解决了我的问题,我可以通过JACOB使用它。