2013-05-20 19 views
5

CodeProject ha un ottimo Windows shell extension tutorial.Equivalente WiX di "Regasm.exe my.dll/codebase"?

Compilare, eseguire Regasm.exe CSShellExtContextMenuHandler.dll /codebase e l'estensione della shell è disponibile, funziona benissimo.

Ma chiedere agli utenti di eseguire Regasm non sarebbe facile da usare, quindi ho scritto il piccolo script WiX di seguito. (Ho appena copiato l'output di heat, oltre a una DLL di dipendenza che voglio usare).

PROBLEMA: Quando installo l'MSI risultante, l'estensione della shell non appare (in Esplora risorse, clic destro su un file non mostrare la mia voce, nonostante lavorare con Regasm)

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> 

    <Product Name='HelloWorld Shell Extension' Id='2afd44ab-16d7-40f4-8741-69ad546cb7cf' UpgradeCode='c5139d19-21ba-43c6-a17d-68760331f332' 
    Language='1033' Codepage='1252' Version='0.4.4' Manufacturer='Me'> 

    <Package Id='*' Keywords='Installer' Description="HelloWorld Shell Extension Setup" Manufacturer='Me' 
     InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' /> 

    <Media Id='1' Cabinet='HelloWorldShellExtension.cab' EmbedCab='yes' DiskPrompt='HelloWorld CAB' /> 
    <Property Id='DiskPrompt' Value="HelloWorldShellExtension Bundle CAB Installation" /> 

    <Directory Id='TARGETDIR' Name='SourceDir'> 
     <Directory Id='ProgramFilesFolder' Name='PFiles'> 
      <Directory Id='INSTALLDIR' Name='HelloWorldShellExtension'> 
      <Component Id="cmpB0970E4FB9610FC20E1C6B6B2D45C606" Guid="7044db96-17d3-4d4f-93b0-135b89b042c8"> 
       <Class Id="{CE43A2AB-B457-49BF-C83F-4306208D438B}" Context="InprocServer32" Description="CSShellExtContextMenuHandler.FileContextMenuExt" ThreadingModel="both" ForeignServer="mscoree.dll"> 
        <ProgId Id="CSShellExtContextMenuHandler.FileContextMenuExt" Description="CSShellExtContextMenuHandler.FileContextMenuExt" /> 
       </Class> 
       <File Id="fil5B7C752C5541C807852A6781921F95AB" KeyPath="yes" Source="bin\CSShellExtContextMenuHandler.dll" /> 
       <RegistryValue Root="HKCR" Key="*\shellex\ContextMenuHandlers\{ce43a2ab-b457-49bf-c83f-4306208d438b}" Value="CSShellExtContextMenuHandler.FileContextMenuExt Class" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="Class" Value="CSShellExtContextMenuHandler.FileContextMenuExt" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="Assembly" Value="CSShellExtContextMenuHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=73df467e0a99a326" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#fil5B7C752C5541C807852A6781921F95AB]" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="Class" Value="CSShellExtContextMenuHandler.FileContextMenuExt" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="Assembly" Value="CSShellExtContextMenuHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=73df467e0a99a326" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="CodeBase" Value="file:///[#fil5B7C752C5541C807852A6781921F95AB]" Type="string" Action="write" /> 
      </Component> 
      <Component Id='Libraries' Guid='f982a0bb-824d-4835-921d-e51b47b8598b'> 
       <File Id='dependency.dll' Name='dependency.dll' Source='bin\dependency.dll' DiskId='1' /> 
      </Component> 
     </Directory> 
     </Directory> 
    </Directory> 

    <Feature Id='HelloWorldShellExtensionFeature' Title='HelloWorld' Description='HelloWorld' Level='1' AllowAdvertise='no'> 
     <ComponentRef Id="cmpB0970E4FB9610FC20E1C6B6B2D45C606" /> 
     <ComponentRef Id="Libraries" /> 
    </Feature> 

    <UI> 
     <UIRef Id="WixUI_InstallDir" /> 
    </UI> 

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" /> 
    </Product> 
</Wix> 

Ho provato a cambiare Root="HKCR" Key="[...]" a Root="HKLM" Key="SOFTWARE\Classes\[...]", per imitare le chiavi che Regasm installa effettivamente, ma che non funziona neanche.

risposta

4

Innanzitutto, il CLSID che si sta utilizzando è diverso dalla sorgente di esempio originale. Forse l'hai modificato per renderlo tuo. Assicurati di utilizzare lo stesso valore dell'attributo nella classe FileContextMenuExt.

Il file heat.exe di WiX non sembra supportare l'elemento codebase. Forse l'assunto è che, dal momento che si registra l'assemblaggio COM a livello di macchina, lo si inserirà anche nel punto di assemblaggio a livello di macchina (ad esempio, il GAC). Se lo fai, codebase non sarà richiesto.

heat file ... genererà tutto tranne l'elemento Codebase ma l'hai inserito manualmente, vedo. Hai anche l'altra richiesta di registrazione, *\shellex\ContextMenuHandlers. È un elemento specifico dell'applicazione quindi non può essere generato. Ma anche tu l'hai inserito a mano.

Infine, il programma di installazione e explorer.exe devono avere la stessa "bit-ness". In caso contrario, il programma di installazione potrebbe creare voci di registro per explorer.exe a 32 bit in cui il file explorer.exe a 64 bit non le vedrà. Per distribuire il prodotto, devi avere una versione x86 e una X64 del programma di installazione. È possibile impostare in modo esplicito la piattaforma per il pacchetto nell'elemento Wix/Product/Package.

A parte questo, il tuo Product.wxs "funziona sulla mia macchina".