SharpShellを使用して Windows Explorer シェル用の ContextMenuHandler を作成しました。アセンブリは AnyCPU 用に、つまり MSIL でビルドされているため、32 ビットと 64 ビットの両方で実行できます。
これを 64 ビット Windows でのみ実行するつもりですが、Windows 64 上の 32 ビット アプリケーションは、開いているダイアログなどに 32 ビット バージョンのシェルを引き続き使用します。
両方のアーキテクチャ (32 & 64) で regasm ツールを使用してこのアセンブリを手動で登録しましたが、64 ビット Windows エクスプローラーで正常に動作します。また、32 ビット アプリケーションでは、ファイルを開いたり、他のシェルが提供するダイアログからも機能します。これは意図された動作です。
私が抱えている問題は、インストール スクリプトを作成することです。私はWix 3.7 を使用していますが、regasm を使用したくありません。
64 ビット コンポーネントは次のようにインストールされます。
<Component Id="cmpMyAssembly64" Directory="INSTALL_TO_HERE"
Location="local" Win64="yes">
<File Id="filMyAssembly" KeyPath="yes" Source="mySource.dll"
Assembly=".net" AssemblyApplication="filMyAssembly"
ProcessorArchitecture="msil"/>
<Class Id="01201201-0000-0000-0000-012345670123" Description="My Handler"
Context="InprocServer32" ThreadingModel="both" ForeignServer="mscoree.dll">
<ProgId Id="A.ContextHandler" Description="Does something" />
</Class>
<RegistryKey Root="HKCR" Key="CLSID\{01201201-0000-0000-0000-012345670123}"
ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes">
<RegistryKey Key="Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}">
<RegistryValue Value="" Type="string" />
</RegistryKey>
<RegistryKey Key="InprocServer32">
<RegistryKey Key="1.0.0.0">
<RegistryValue Name="Class" Value="aNamespace.theClass" Type="string" />
<RegistryValue Name="Assembly" Value="!(bind.assemblyFullName.filMyAssembly)" Type="string" />
<RegistryValue Name="RuntimeVersion" Value="v4.0.30319" Type="string" />
<RegistryValue Name="CodeBase" Value="file:///[#filMyAssembly]" Type="string" />
</RegistryKey>
<RegistryValue Name="Class" Value="aNamespace.theClass" Type="string" />
<RegistryValue Name="Assembly" Value="!(bind.assemblyFullName.filMyAssembly)" Type="string" />
<RegistryValue Name="RuntimeVersion" Value="v4.0.30319" Type="string" />
<RegistryValue Name="CodeBase" Value="file:///[#filMyAssembly]" Type="string" />
</RegistryKey>
</RegistryKey>
<RegistryValue Root="HKCR" Key="Directory\Background\shellex\ContextMenuHandlers\MyHandler" Value="{guid}" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="Directory\shellex\ContextMenuHandlers\MyHandler" Value="{guid}" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="Drive\shellex\ContextMenuHandlers\MyHandler" Value="{guid}" Type="string" Action="write" />
</Component>
私が抱えている問題は、32ビット版の登録にあります。同じアセンブリを使用するため、同じファイルを 2 回インストールしたくありません。別の (32 ビット) コンポーネントを作成し、必要なレジストリの変更を行うだけです。
<Component Id="cmp32BitVersion" Directory="INSTALL_TO_32"
Location="local" Win64="no">
<Class ... just like 64bit
<RegistryKey ... just like 64bit
</Component>
ここで、Win64 の yes/no は、Windows インストーラーがレジストリのどの部分に書き込むかを決定する方法であると想定しました。64 ビット コンポーネントの場合は HKCR... に書き込み、32 ビット コンポーネントの場合は HKLM\SOFTWARE\WOW6432Node\Classes に書き込みます。私が抱えている問題は、両方のコンポーネントがファイル参照 [#filMyAssembly] を使用しているため、ICE69: Mismatched component reference, warnings が表示されることです。コードは引き続きビルドされますが、警告が表示されないようにすることをお勧めします。
とにかく、私の質問は次のとおりです。Wix/Windows インストーラーを使用して、64 ビットと 32 ビットの両方のアプリケーションで COM 用の MSIL アセンブリを登録する正しい方法は何ですか?