JACOB 库的有效 COM 结构是什么?
What is a valid COM structure for JACOB library?
我正在使用 JACOB(Java COM 桥)库从我的 Windows OS 调用已注册的 COM 对象。
我花了一段时间才弄清楚 JACOB 的工作原理并设置了所有内容。所以我目前的问题是:
ActiveXComponent comp = new ActiveXComponent("iTunes.Application");
例如,我的 iTunes 可以正常启动等。
如果我想调用用 C# JACOB 编写的自生成和注册的 COM 对象,则会响应以下错误:
Exception in thread "main" com.jacob.com.ComFailException: Can't co-create object
我的 iTunes 启动对我来说是一个指标,表明一切设置正确,我不确定为什么 JACOB 不能调用我自己的 .dll
目前我正在使用 Visual Studio 2015 on build register 的 COM interop 功能,这在过去对我来说非常好。 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 应该已经注册了。
我会先写一个 VBS(VB 脚本)程序来测试你的 DLL 并确保它运行。
set obj = CreateObject("test.application")
MsgBox TypeName(obj)
确保它成功。如果失败,那么(假设是 64 位 OS),用 c:\windows\syswow64\wscript.exe path\to\your\script.vbs.
试试 运行
检查您的 Java 进程是 64 位还是 32 位进程。您的 C# DLL 必须注册为与您的 Java 进程相同的位数才能成功。
感谢提示,我找到了解决办法:
Visual Studio 显然将我的 COM 对象注册为 32 位。
我不确定这是否是默认设置(?)。
所以两个简单的步骤就解决了这个问题:
以管理员身份打开 windows cmd。
运行 以下命令:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /verbose /nologo /codebase "你的 dll 路径"
该命令将以 64 位而不是 32 位注册 .dll。
这解决了我的问题,我可以通过 JACOB 使用它。
我正在使用 JACOB(Java COM 桥)库从我的 Windows OS 调用已注册的 COM 对象。 我花了一段时间才弄清楚 JACOB 的工作原理并设置了所有内容。所以我目前的问题是:
ActiveXComponent comp = new ActiveXComponent("iTunes.Application");
例如,我的 iTunes 可以正常启动等。 如果我想调用用 C# JACOB 编写的自生成和注册的 COM 对象,则会响应以下错误:
Exception in thread "main" com.jacob.com.ComFailException: Can't co-create object
我的 iTunes 启动对我来说是一个指标,表明一切设置正确,我不确定为什么 JACOB 不能调用我自己的 .dll
目前我正在使用 Visual Studio 2015 on build register 的 COM interop 功能,这在过去对我来说非常好。 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 应该已经注册了。
我会先写一个 VBS(VB 脚本)程序来测试你的 DLL 并确保它运行。
set obj = CreateObject("test.application")
MsgBox TypeName(obj)
确保它成功。如果失败,那么(假设是 64 位 OS),用 c:\windows\syswow64\wscript.exe path\to\your\script.vbs.
试试 运行检查您的 Java 进程是 64 位还是 32 位进程。您的 C# DLL 必须注册为与您的 Java 进程相同的位数才能成功。
感谢提示,我找到了解决办法:
Visual Studio 显然将我的 COM 对象注册为 32 位。 我不确定这是否是默认设置(?)。
所以两个简单的步骤就解决了这个问题:
以管理员身份打开 windows cmd。
运行 以下命令:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /verbose /nologo /codebase "你的 dll 路径"
该命令将以 64 位而不是 32 位注册 .dll。 这解决了我的问题,我可以通过 JACOB 使用它。