Powershell не может использовать COM-объект при использовании COM без регистрации - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь использовать COM-объект без регистрации в PowerShell. Мой компонент - x86, а poweshell_ise.exe - также x86.

Для этого я создал манифест для com-сервера на базе dll:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <assemblyIdentity name="ComComponent" processorArchitecture="X86" type="win32" version="1.0.0.0"></assemblyIdentity>
   <file name="ComComponent.dll" hashalg="SHA1">
      <comClass clsid="{<CLASS_CLSID>}" tlbid="{<TLB_CLSID>}" progid="ComComponent.ComComponent" description="ComComponent Class"»
      <typelib tlbid="{<TLB_CLSID>}" version="1.0" resourceid="2" helpdir="" flags="HASDISKIMAGE"></typelib>
   </file>
</assembly>

И манифест для сценария powershell:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="PSScript" type="win32" />
<dependency>
<dependentAssembly>
    <assemblyIdentity type="win32" name="ComComponent" version="1.0.0.0"
 processorArchitecture="x86" />
</dependentAssembly>
</dependency>
</assembly>

В PowerShell я использую его следующим образом:

$actctx = New-Object -COM Microsoft.Windows.ActCTX
$actctx.Manifest = "<path to manifest>"
$obj= $actctx.CreateObject("ComComponent.ComComponent")
$obj.ComMethod()

После этого я получаю следующую ошибку:

Method invocation failed because [System.__ComObject] does not contain a method named 'ComMethod'.

Я вижу, что ComComponent.dll загружается в powershell_ise.exe в Process Explorer. Также я вижу, что powershell по какой-то причине пытается прочитать HKCR\TypeLib\{<TLB_CLSID>} раздел реестра.

Та же функциональность работает в powershell с зарегистрированным COM. Я попытался поместить библиотеку типов в отдельный файл с тем же результатом.

В чем может быть проблема? Спасибо

1 Ответ

0 голосов
/ 03 июня 2019

Я бы попробовал следующий подход:

$myDll = Add-Type –memberDefinition @” 
    [DllImport("ComComponent.dll")] 
    public static extern bool myFunction(<parameters>);
“@ -name "myDll" -namespace Win32Functions –passThru

    $myDll::myFunction(<Parameters>) | Out-Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...