2009-08-17 12 views
2

J'ai écrit quelques compléments Excel 2003/2007 en utilisant VSTO, et je finis généralement par référencer les DLLs .NET dans le projet VSTO (généralement le code que je réutilise à travers les projets).
J'ai rencontré le problème suivant. Alors que les appels à la dll fonctionnent parfaitement en mode débogage ou sur la machine de développement, lorsque je déploie le complément via un programme d'installation msi, la DLL est ajoutée au dossier du complément, mais le complément ne l'est pas. semblent pouvoir appeler la DLL. Après quelques difficultés, j'ai trouvé un moyen de contourner cela: en plus de l'action personnalisée dans le programme d'installation accordant la sécurité au complément, j'ajoute une autre action personnalisée accordant la sécurité à chaque dll référencée par le complément, suivant les étapes décrites dans
http://msdn.microsoft.com/en-us/library/bb332052.aspxComment ajouter un assembly référencé au déploiement d'un projet VSTO?

Mon problème est que pendant que cela fonctionne, je ne suis pas convaincu que je le fais bien. C'est très fastidieux, et je reçois aussi un avertissement quand je construis, ce qui, d'après ce que je peux faire, indique en fait que la sécurité est accordée deux fois au même endroit.
Quelqu'un ici peut me dire si je le fais bien ou pas, et quelle est la meilleure façon, s'il y en a une?

Répondre

1

Dans mon cas, j'ai une suite de compléments sous MyCompany.Office.

J'ai une bibliothèque partagée de fonctionnalité de base appelée MyCompany.Office.dll, qui est référencée par MyCompany.Office.Word.dll et MyCompany.Office.Excel.dll, qui sont les deux compléments (vous pourriez facilement avoir plusieurs compléments pour Excel plutôt qu'un pour Word et un pour Excel, ou ce que vous voulez).

Ce que j'ai fait a été de créer un fichier de clés de nom fort pour la solution et de le lier dans les trois projets. J'ai ensuite signé les trois bibliothèques avec le même fichier keyfile.

J'ai ensuite créé une action d'installation qui ajoute une entrée CAS en utilisant la clé publique comme preuve, plutôt que l'emplacement du fichier. Par conséquent, mon action personnalisée appelle finalement caspol.exe -m -q -ag "My_Computer_Zone" -strong -hex <my public key> -noname -noversion FullTrust -n "MyCompany_Office" -d "Code group for MyCompany.Office add-ins.". Cela donne FullTrust à toutes les bibliothèques avec cette clé publique.

Vous pouvez afficher la clé publique en ouvrant une invite de commande, en accédant à l'emplacement du fichier de clés et en tapant sn -Tp mykeyfile.snk. Si vous voulez obtenir la clé publique programmaticalement (comme extension SetSecurity), vous pouvez utiliser le code comme ceci:

private static String GetPublicKeyHexString(String assemblyPath) 
{ 
    AssemblyName assmName = Assembly.LoadFile(assemblyPath).GetName(); 
    StringBuilder output = new StringBuilder(); 
    Byte[] publicKey = assmName.GetPublicKey(); 

    foreach(Byte byte in publicKey) 
    { 
     output.Append(byte.ToString("x").PadLeft(2, '0')); 
    } 

    return output.ToString(); 
} 
+0

J'ai besoin d'essayer cela avant de marquer cela comme une réponse valable, mais cela semble raisonnable. – Mathias

+0

Vous pouvez également utiliser une URL comme preuve et définir l'URL de votre répertoire d'installation. Ainsi, donner tous les assemblys dans ce dossier FullTrust. Je ne le recommande pas cependant. Quelqu'un pourrait déposer une assembly malveillante dans votre dossier d'installation, lui donnant une confiance totale, et quelqu'un pourrait vous reprocher la création d'une vulnérabilité. Je ne le mentionne que dans le cas où quelqu'un le suggère, afin que vous puissiez voir pourquoi ce n'est pas une bonne idée. – HackedByChinese

+0

Merci, je crois que cela fonctionne. J'ai effectivement trouvé ce post sur le forum msdn, qui propose une petite modification du projet SetSecurity, permettant d'ajouter une liste de DLL séparées par des virgules au lieu d'une seule DLL (poste Lex007 dans le thread). De cette façon, vous n'êtes pas obligé de partager la même clé. http://social.msdn.microsoft.com/forums/fr-FR/vsto/thread/cec6abb6-4716-4bde-91f2-25fb68abd54e/ – Mathias

Questions connexes