Comment enregistrer un .NET CCW avec regasm à partir d'un projet d'installation de Visual Studio 2008

StackOverflow https://stackoverflow.com/questions/239465

Question

J'ai un projet d'installation pour une application de service .NET qui utilise un composant .NET qui expose une interface COM (encapsulable COM / CCW). Pour que le composant fonctionne sur une machine cible, il doit être enregistré avec

.
  

regasm.exe / tlb / codebase composant.dll

Le commutateur / tlb pour générer la bibliothèque de types est obligatoire dans ce cas, sinon je ne peux pas créer d'objets à partir de cet assemblage.

La question est de savoir comment puis-je configurer mon projet d'installation Visual Studio 2008 pour enregistrer cet assembly avec un appel à regasm / tlb?

Était-ce utile?

La solution

Vous pouvez perdre l'appel manuel à regasm.exe en utilisant plutôt System.Runtime.InteropServices.RegistrationServices:

[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.");
}
}

Ceci annule également l'enregistrement de la bibliothèque lors de la désinstallation.

Autres conseils

  1. Dans votre projet principal (celui contenant la classe que vous souhaitez enregistrer), cliquez avec le bouton droit de la souris sur le fichier de projet, sélectionnez Ajouter / Nouvel élément et sélectionnez Classe d'installation. Appelez ça quelque chose comme clsRegisterDll.cs
  2. Dans le concepteur qui apparaît, cliquez sur "Cliquez ici pour passer en mode Code" ou cliquez avec le bouton droit de la souris sur le fichier clsRegisterDll.cs dans l'explorateur de solutions, puis sélectionnez Afficher le code
  3. .
  4. Redéfinissez les méthodes d'installation, de validation et de désinstallation en ajoutant:

    // Obtenir l'emplacement du regasm string regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory () + @ "regasm.exe" ;; // Obtenir l'emplacement de notre DLL string ComponentPath = typeof (RegisterAssembly) .Assembly.Location; // Execute regasm
    System.Diagnostics.Process.Start (regasmPath, "/ codebase / tlb" "" + ComponentPath + "" ";;);

    Échangez / codebase / tlb pour / u dans l'action de désinstallation.

  5. Compilez votre projet
  6. Dans votre programme d'installation, assurez-vous que vous avez ajouté votre dll au dossier Applications, puis cliquez avec le bouton droit de la souris sur le projet d'installation et sélectionnez Afficher / Actions personnalisées
  7. .
  8. Cliquez avec le bouton droit de la souris sur Installer, puis cliquez sur Ajouter une action personnalisée
  9. .
  10. Double-cliquez sur le dossier de l’application, puis sur votre dll
  11. Faites de même pour l'action de validation
  12. Construisez et testez votre programme d'installation

Vous trouverez une procédure pas à pas avec une classe à essayer à l'adresse suivante: http: // leon.mvps.org/DotNet/RegasmInstaller.html

Votre service doit avoir une classe d’installateur. Inscrivez-vous à l'événement OnAfterInstall et appelez RegAsm: le chemin doit être calculé à partir du répertoire Windows et lié à une version .Net spécifique.

J'ai d'abord essayé de lancer regasm à partir du processus d'installation (avant de voir cette publication). Essayer de lancer regasm, et gérer toutes les erreurs était problématique - même sans essayer de gérer les privilèges élevés pour Windows 7.

L'utilisation de Runtime.InteropServices.RegistrationServices.RegisterAssembly était beaucoup plus propre et fournissait une bien meilleure interception d'erreur.

Le programme d’installation de Visual Studio effectue uniquement l’enregistrement de la classe COM, mais pas la génération et l’enregistrement de la bibliothèque de types (c’est ce que / tlb bascule sur regasm.exe fait ) par défaut. Au moins dans Visual Studio 2017, il suffit de générer la bibliothèque de types dans les étapes post-génération de DLL pour être enregistrée à l'aide de l'utilitaire Tlbexp.exe .

Si le projet d'installation découvre un fichier portant l'extension .tlb dans le même répertoire et avec le même nom que la bibliothèque que vous installez, il l'inclut automatiquement dans le projet d'installation et effectue les étapes d'enregistrement. lors de l'installation. Bien entendu, il est également possible de générer manuellement le fichier .tlb et de l'inclure dans le projet d'installation (et de définir sa propriété Register sur vsdrfCOM ).

Voici un excellent article sur C # et l’interface COM. Les informations ci-dessus proviennent de la section intitulée "Déploiement".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top