powershell で COM オブジェクトを登録なしで使用しようとしています。私のコンポーネントは x86 で、poweshell_ise.exe も x86 です。
これを行うために、dll ベースの com サーバーのマニフェストを作成しました。
<?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'.
Process Explorer にComComponent.dll
読み込まれていることがわかります。また、何らかの理由で powershell がレジストリ キーpowershell_ise.exe
を読み取ろうとしていることがわかります。HKCR\TypeLib\{<TLB_CLSID>}
同じ機能が、登録済みの COM を使用して powershell で機能しています。タイプライブラリを別のファイルに入れようとしましたが、同じ結果になりました。
何が問題になる可能性がありますか? ありがとうございました