Domanda

Ho un progetto di installazione per un'applicazione di servizio .NET che utilizza un componente .NET che espone un'interfaccia COM (wrapper / CCW callable COM). Per far funzionare il componente su una macchina target, deve essere registrato con

  

regasm.exe / tlb / codebase component.dll

L'opzione / tlb per generare il typelib è obbligatoria in questo caso, altrimenti non posso creare oggetti da quell'assemblaggio.

La domanda è: come posso configurare il mio Setup-Project di Visual Studio 2008 per registrare questo assembly con una chiamata a regasm / tlb?

È stato utile?

Soluzione

Puoi perdere la chiamata manuale a regasm.exe usando System.Runtime.InteropServices.RegistrationServices invece:

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
{
    throw new InstallException("Failed to register for COM Interop.");
}

}

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.UnregisterAssembly(GetType().Assembly))
{
    throw new InstallException("Failed to unregister for COM Interop.");
}
}

Anche questo annulla la registrazione della libreria al momento della disinstallazione.

Altri suggerimenti

  1. Nel progetto principale (quello contenente la classe che si desidera registrare), fare clic con il tasto destro sul file di progetto e selezionare Aggiungi / Nuovo elemento e selezionare Classe installatore. Chiamalo in qualche modo come clsRegisterDll.cs
  2. Nella finestra di progettazione visualizzata, fai clic su "Fai clic qui per passare alla visualizzazione del codice" oppure fai clic con il pulsante destro del mouse sul file clsRegisterDll.cs in Esplora soluzioni e seleziona Visualizza codice
  3. Sostituisci i metodi di installazione, commit e disinstallazione aggiungendo:

    // Ottieni la posizione del regasm string regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory () + @ " regasm.exe " ;; // Ottieni la posizione della nostra DLL string componentPath = typeof (RegisterAssembly) .Assembly.Location; // Esegui regasm
    System.Diagnostics.Process.Start (regasmPath, " / codebase / tlb \ " " + componentPath + " \ " ");

    Scambia / codebase / tlb per / u nell'azione di disinstallazione.

  4. Compila il tuo progetto
  5. Nel programma di installazione, assicurati di aver aggiunto la tua dll alla cartella dell'applicazione, quindi fai clic con il pulsante destro del mouse sul progetto di installazione e seleziona Visualizza / Azioni personalizzate
  6. Fai clic con il pulsante destro del mouse su Installa, quindi fai clic su Aggiungi azione personalizzata
  7. Fai doppio clic su Cartella applicazione, quindi sulla tua dll
  8. Fai lo stesso per l'azione Commit
  9. Crea e testa il tuo programma di installazione

Una procedura dettagliata con una classe effettiva da provare è disponibile all'indirizzo: http: // leon.mvps.org/DotNet/RegasmInstaller.html

Il tuo servizio dovrebbe avere una classe Installer. Registrati all'evento OnAfterInstall e chiama RegAsm: il percorso deve essere calcolato dalla directory di Windows e legato a una specifica versione .Net.

Inizialmente ho provato a eseguire regasm dal processo di installazione (prima di vedere questo post). Cercare di eseguire il regasm e gestire tutti gli errori era problematico, anche senza provare a gestire privilegi elevati per Windows 7.

L'uso di Runtime.InteropServices.RegistrationServices.RegisterAssembly è stato molto più pulito e ha fornito un trapping di errori molto migliore.

Il programma di installazione di Visual Studio esegue solo la registrazione della classe COM, ma non effettua la generazione e la registrazione della libreria dei tipi (questo è ciò che / tlb passa a regasm.exe ) predefinito. Almeno in Visual Studio 2017 è sufficiente generare la libreria dei tipi nei passaggi post-build della DLL per essere registrata utilizzando l'utilità Tlbexp.exe .

Se il progetto di installazione rileva un file con estensione .tlb nella stessa directory e con lo stesso nome della libreria che si sta installando, lo include automaticamente nel progetto di installazione ed effettua le fasi di registrazione durante l'installazione. Naturalmente è anche possibile generare manualmente il file .tlb e includerlo nel progetto di installazione (e impostare la proprietà Register su vsdrfCOM ).

Ecco un ottimo articolo sull'interfaccia C # e COM e le informazioni di cui sopra provengono dalla sua sezione chiamata Deployment.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top