Какая допустимая структура COM для библиотеки JACOB?

Я использую библиотеку JACOB (Java COM Bridge) для вызова зарегистрированных COM-объектов из моей ОС Windows. Мне потребовалось некоторое время, пока я понял, как работает JACOB, и все настроил. Итак, моя текущая проблема заключается в следующем:

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

например, работает, мой iTunes запускается правильно и т. д. Если я хочу вызвать самостоятельно сгенерированный и зарегистрированный COM-объект, написанный на C #, 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
{
}

Что-то не так с моей dll C# или JACOB требует определенного типа структуры в этой dll?

К сожалению, мне не удалось найти примеры COM для JACOB.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Если я изменю свою первую строку на:

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

Я получаю следующее исключение:

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

Однако моя .dll должна быть зарегистрирована.


person LOLWTFasdasd asdad    schedule 14.04.2016    source источник


Ответы (2)


Я бы сначала написал программу VBS (скрипт VB), чтобы протестировать вашу DLL и убедиться, что она работает.

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

Убедитесь, что это удается. Если это не удается, то (при условии 64-разрядной ОС) попробуйте запустить его с помощью пути c:\windows\syswow64\wscript.exe\to\your\script.vbs.

Проверьте, является ли ваш процесс Java 64-битным или 32-битным процессом. Ваша C# DLL должна быть зарегистрирована с той же разрядностью, что и ваш Java-процесс, чтобы она была успешной.

person Joseph Willcoxson    schedule 14.04.2016

Спасибо за подсказку, я смог найти решение:

Visual Studio, по-видимому, зарегистрировала мой COM-объект как 32-битный. Я не уверен, что это настройка по умолчанию (?).

Итак, два простых шага для решения проблемы:

  1. откройте Windows cmd от имени администратора.

  2. Выполните следующую команду:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /verbose /nlogo /codebase путь к вашей dll

Команда зарегистрирует .dll в 64-битной, а не в 32-битной версии. Это решило проблему для меня, и я мог использовать ее через JACOB.

person LOLWTFasdasd asdad    schedule 15.04.2016