2016-05-19 10 views
0

Je veux créer une application console simple pour enregistrer automatiquement une DLL.C# dll de registre en utilisant le chemin du fichier (RegistrationService.RegisterAssembly)

Après quelques recherches, je trouve ce morceau de code:

public static bool Register_Dlls(string dllPath) 
{ 
    Assembly asm = Assembly.LoadFile(dllPath); 
    RegistrationServices regAsm = new RegistrationServices(); 
    bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase); 
    return bResult; 
} 

La mise en œuvre de mon application en utilisant ce code et l'exécuter en tant qu'administrateur du dll ne peut pas être enregistré. C'est mon problème.

Mais en utilisant la commande RegAsm à l'intérieur du cmd (en tant qu'administrateur), le dll est correctement enregistré:

C:\windows\system32> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe C:\PWS\Bin\MyContextMenu.dll /codebase 

Ma question est: suis-je oublié quelque chose ou le code ci-dessus ne peut être utilisé pour mon but? La DLL a été compilée dans le mode de plates-formes de solutions 'N'IMPORTE QUELLE UC', comme mon application, et j'ai besoin d'enregistrer l'ensemble sur une machine x 64.

+0

Dans le projet de votre DLL, dans le fichier AssemblyInfo, l'attribut 'ComVisible' devrait exister avec la valeur par défaut' false'. L'avez-vous changé en 'vrai'? La ligne résultante devrait être '[assembly: ComVisible (true)]'. – Sam

+0

"ne peut pas être enregistré" n'est pas un diagnostic utile, vous devrez nous dire à quoi ressemble l'échec. Si vous n'avez pas vu l'invite d'élévation UAC, l'échec est garanti. –

+0

Oui, la classe est COM visible, j'ai utilisé l'attribut '[ComVisible (true)]' avant la déclaration de classe. – baru

Répondre

0

Solution:

Je compilé mon application forçant 'x64' Solution mode Plates-formes, maintenant tout fonctionne très bien.

En outre, suite à la dernière Hans Passant comment, j'ai amélioré mon code en modifiant le manifeste dans son champ requestedExecutionLevel et en ajoutant la méthode IsUserAdministrator(). Merci Hans!