2017-02-09 15 views
0

Я нахожусь на стене, которую я понимаю. У меня есть простой COM-сервер, который я хочу создать. Я могу сделать это с помощью простых VBS или команд PS вне моего EXE:.NET Процесс не может создать объект ActiveX

$sms_client = New-Object -COM 'CPApplet.CPAppletMgr' 

Set controlPanelAppletManager = CreateObject("CPApplet.CPAppletMgr") 

В моих C# код, который я попробовал раннее связывание, поздно переплет, PS пространство выполнения/трубопровод и, наконец, Process.Start (Cscript myVBS). Во всех этих сценариях он возвращается с классом, который не зарегистрирован и терпит неудачу.

//throws exception 
CPAPPLETLib.CPAppletMgr cpAppletMgr= new CPAPPLETLib.CPAppletMgr(); 

// myType does not come back null 
Type myType = Type.GetTypeFromProgID("CPApplet.CPAppletMgr"); 
// throws exception 
object myObject = Activator.CreateInstance(myType); 

Обновление: Я могу создать Scripting.FileSystemObject без проблем. Мне это не нужно ... это был просто тест.

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

Я пропустил что-то, что является .NET 101 COM-Interop фундаментальным?

Retrieving the COM class factory for component with CLSID {096C5BA8-044B-4BAC-9914-144723BA4F2A} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 

Update:

Установка платформы на x64 допущена ошибка исчезнет. AnyCPU и x86 терпят неудачу. Означает ли это, что мне нужно создать 2 версии EXE для 32-битных и 64-битных рабочих станций?

+0

Эта статья может помочь: [Использование 32-разрядных или 64-разрядных компонентов ActiveX в x64 Windows] (http://cknotes.com/using-32-bit-or-64-bit-activex-components-on- x64-windows /) – TnTinMn

ответ

1

Это не обязательно означает, что вам нужно создать два экземпляра. Вы должны иметь возможность создавать только один, пока вы делаете его AnyCPU. Дело в том, что вы должны зарегистрировать его с правильным временем выполнения. По умолчанию Visual Studio регистрирует AnyCPU с 32-разрядной средой выполнения на 64-разрядной машине. Если вы запустите regasm.exe с 64-битной версией и правильной версией среды выполнения, то вы сможете назвать ее из 64-битного процесса.

Однако в моем магазине мы, как правило, скомпилировали один для x86 и один для x64 и разворачиваем правый для правильной платформы.

+0

У меня на самом деле много опыта с этим и по какой-то причине был просто плохой день. Пытаясь сузить причину, я переключился с любого процессора на x86, но не заметил вариант «Предпочтение 32 бит». Я неправильно предположил, что мой процесс работает 64 бит и помечен как возможная причина. Это оставило меня в углу, подчеркнув, что может вызвать что-то настолько простое. –

 Смежные вопросы

  • Нет связанных вопросов^_^