Question

Son peut-être tout simplement im manque quelque chose ici mais, quand j'écris un code pour Excel Interop, voici comment ça se passe.

  • ajouter une référence aux bibliothèques Com Excel.
  • VS crée une PIA -. Microsoft.Office.Interop.Excel .... (? Via tlbimp droite)
  • copier l'exe et dll Interop (PIA) à toute machine (avec .net) et il fonctionne?

Y at-il un scénario dans lequel je dois déployer / enregistrer le PIA? Ou ai-je eu tort de quelque chose, parce qu'il me semble intégrer l'PIA dans l'ensemble principal ne semble pas comme une caractéristique très grande?

S'il vous plaît excuser mon ignorance, le cas échéant.


Mise à jour: Donc, je l'ai fait quelques tests, je l'ai écrit une application qui ouvre Excel ajoute « bonjour » dans une cellule et enregistre le fichier.

Je l'ai construit sur ma machine Win7 Dev avec Office 2003 installé (donc j'ai parlé 2003 libs). Fait intéressant, sans intégré l'application de PIA est 9KB (1,32 Mo au total jusqu'à 3 de la PIA). Avec l'exe est 13KB PIA intégré.

En second lieu, intégré PIA, l'application a travaillé sur une machine avec Office 2007 et 2010. sans intégré PIA, sur Windows XP + office2007 il n'a pas seulement quand PIA étaient pas dans le répertoire de l'exe.

donc je suppose que quelle que soit la méthode, il y a une sorte de résolution dynamique? Et pourquoi at-il travailler sur un Win7 sans PIA dans le répertoire exe, mais sur Windows XP, il a échoué (seulement quand PIA étaient pas dans le répertoire de l'exe), a fait la boîte Win7 ont prolly déployés dans le monde ou de quelque chose du PIA?

Merci
Gideon

Était-ce utile?

La solution

Il est pas commun à réellement besoin d'une PIA. Vous devez avoir un si vous exposez tous les types de PIA de la bibliothèque de type Excel dans un de vos classes publiques. Cela va mal quand tout autre code utilise votre classe et ne pas utiliser la même bibliothèque Interop. Un type .NET n'est identique quand ils sont venus de la même assemblée. Vous obtiendriez un difficile à interpréter un message d'erreur comme « Impossible de lancer des applications à la demande ». Le PIA assure que tout le monde utilise le même type. Tant que tout le monde utilise la même version PIA, ce qui en soi est un problème difficile. Déploiement de votre propre DLL Interop avec votre application est très bien si vous pouvez éviter cela. Ce qui est pas difficile dans la plupart des scénarios.

Ce problème a été résolu dans la version 4.0 .NET grâce à une fonctionnalité appelée « équivalence de type ». Il est spécifique aux types d'interface COM, le CLR les considère compatibles quand ils ont le même [Guid] et la même déclaration, quel que soit ce qui les contient l'assemblage. On a ensuite mis à profit avec la fonction 'intégrer Interop types de (comme « non pia »), le compilateur intègre le type Interop dans les métadonnées de votre assemblée. Seuls ceux que vous utilisez.

Vous ne devez pas expédier la bibliothèque Interop plus et ne nécessitent pas l'PIA. Et il est beaucoup plus petit puisque vous ne payez que pour les types que vous utilisez réellement. C'est une beaucoup de coup pour le mâle, fortement recommandé.

Autres conseils

Je n'ai pas fait beaucoup Interop moi-même, mais je crois que:

  • Parfois, le PIA peut être assez grand; si l'application elle-même est assez petite, le PIA peut nain il
  • L'approche non-PIA est plus souple en ce qui concerne versioning: tant que vous utilisez uniquement les membres fournis par la version de l'objet COM qui est en fait fourni, vous allez bien .. . alors que je pense à l'approche de PIA, vous devez utiliser le PIA pour la même version de l'objet COM comme celui sur la machine cible

L'une des principales choses à comprendre au sujet NoPIA est qu'il n'a pas embedd l'PIA dans votre assemblée, mais plutôt que la partie intègre de la PIA que vos utilisations d'application. Elle le fait de manière à grains très fins (tout en bas au niveau de la méthode). Le résultat est généralement une réduction très significative de la taille du déploiement de votre application.

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