2011-08-08 5 views
5

J'ai construit une application, il génère Excel avec COM Interop. Cela fonctionne bien sur le mien et la machine de notre utilisateur: Office 2007, Windows XP SP2. Maintenant, je le migre vers une autre machine, Office 2010, Windows 7 64 bits, et utilise Visual Studio 2010 de VS2008, qui fonctionne toujours très bien. Quand je le déploie sur la machine de mon utilisateur, j'ai le problème, ils utilisent le même Windows 7 64 bit mais Office 2007.Office 2007 PIA

Donc si j'installe Office 2007 PIA sur mon ordinateur Win7 64 bits et Office 2010, changez la référence dans mon projet de studio visuel, cela résoudra-t-il le problème?

+3

Problème? *Quel problème? –

+0

Que se passe-t-il si vous cliquez sur chaque assemblage de bureau et que vous activez "Intégrer les types d'interopérabilité"? Je pense que cela enlève le besoin de se préoccuper de l'emplacement des fichiers PIA ou de la version utilisée. –

Répondre

9

Je sais que cet article a été publié il y a quelque temps, mais je me suis dit que je devais jeter mes deux cents de toute façon au cas où quelqu'un trébucherait dessus.

Une règle générale est d'utiliser la version PIA dans le développement qui relie avec la version la plus ancienne d'Office que vous envisagez de soutenir. Par conséquent, si vous souhaitez prendre en charge Office 2007 et les versions ultérieures, utilisez la version 12 des assemblys PIA lors du développement.

Ajoutez une référence aux assemblys PIA v12 (soit en téléchargeant les assemblys PIA 2007 en ligne, via VSTO, soit à partir du GAC si vous avez déjà utilisé Office 2007 auparavant). Maintenant, vous pourriez penser "Ok, je référence la v12 dans Visual Studio, cela devrait maintenant fonctionner sur Office 2007". Faux. Puisque vous faites référence à v12 mais que vous avez installé Office 2010, lors de l'assemblage, votre machine dira: "Bien, v12 est demandé, mais nous avons installé la v14 dans le GAC et comme les PIA sont compatibles, nous l'utiliserons". Même si vous lui dites explicitement d'utiliser v12, après l'achèvement d'une compilation, votre machine utilisera v14. Vous pouvez le confirmer via FUSLOG. FUSLOG est un excellent outil à utiliser lorsque vous travaillez avec une liaison d'assemblage. Remarque: Si vous ne voyez rien dans FUSLOG et que vous pensez devoir le faire, effacez tout dans votre historique Internet Explorer et réessayez.

Pour résoudre ce problème, vous devez arrêter ce qu'on appelle 'assembly binding redirection'. Ces PIA ont généralement un fichier de stratégie avec eux dans le GAC. Le but du fichier de stratégie est de rediriger les anciennes versions de PIA vers des versions plus récentes lors de la résolution de l'assembly. Pour voir cela, procédez comme suit:

  1. 'Touche Windows + R' Appuyez sur pour ouvrir le menu de l'exécution.
  2. Tapez 'C: \ Windows \ Assembly \ GAC' et appuyez sur Entrée. Remarque: Je cours une machine 32 bits. Vos fichiers PIA seront probablement installés dans un autre emplacement du GAC, par exemple 'C: \ Windows \ Assembly \ GAC_MSIL'.

Une fois dans le GAC, faites défiler vers le bas et recherchez les dossiers des assemblys PIA référencés (par exemple, Microsoft.Office.Interop.Excel). Si vous continuez à défiler, vous devez voir les dossiers commençant par «Policy», puis un numéro, puis le nom de l'assembly PIA (par exemple Policy.12.0.Microsoft.Office.Interop.Excel). C'est le fichier de stratégie qui effectue la redirection de liaison. Ouvrez le fichier de configuration XML dans ce dossier et vous verrez quelque chose de similaire à ce qui suit:

<?xml version="1.0" encoding="UTF-16"?><configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity publicKeyToken="71e9bce111e9429c" name="Microsoft.Office.Interop.Excel" culture="neutral"></assemblyIdentity> 
      <bindingRedirect oldVersion="12.0.0.0" newVersion="14.0.0.0"></bindingRedirect> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Dans l'extrait de code ci-dessus, la balise « bindingRedirect ancienneversion ... » est responsable de la Redirection d'assembly PIA.Si vous commentez ce code comme suit:

<?xml version="1.0" encoding="UTF-16"?><configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity publicKeyToken="71e9bce111e9429c" name="Microsoft.Office.Interop.Excel" culture="neutral"></assemblyIdentity> 
      <!--<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>--> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Ensuite, cette redirection sera ignorée. Je le commente plutôt que de le supprimer simplement parce que le fichier sert un bon but, mais pas lors du développement pour les anciennes versions d'Office. Effectuez cette opération sur chaque fichier de stratégie PIA dont vous avez besoin et votre machine de développement arrêtera la redirection.

J'espère que cela répond à votre question!

+1

Ceci est une information importante! J'ai eu beaucoup de problèmes avec le déploiement de mon application parce que je n'avais pas réalisé la racine du problème. Visual Studio a toujours affiché la version 11 d'origine dans le nom de référence bien que la génération ait été redirigée, comme décrit ci-dessus et dans https://msdn.microsoft.com/en-us/library/2fc472t2%28v=vs.100%29.aspx. – DrMarbuse

Questions connexes