Pregunta

Su posiblemente soy sólo perdiendo algo aquí, pero, cuando escribo algo de código para interoperabilidad de Excel, aquí es cómo va.

  • I añadir una referencia a las bibliotecas Excel Com.
  • VS crea una PIA -. Microsoft.Office.Interop.Excel .... (? Través tlbimp derecha)
  • copio el exe y la interoperabilidad (PIA) DLL para cualquier máquina (con .net) y funciona?

¿Hay un escenario en el que tendría que desplegar / registrar el PIA? O tienen Tengo algo mal aquí, porque me parece que la incorporación de la PIA en el conjunto principal no parece ser una gran característica grande?

Por favor, disculpe mi ignorancia, en su caso.


Actualización:
Así que hice algunas pruebas, escribí una aplicación que abre Excel agrega "hola" en una celda y guarda el archivo.

he construido en mi máquina Win7 Dev con Office 2003 instalado (Así que hice referencia 2003 libs). Curiosamente, sin incrustado de PIA la aplicación es 9KB (1.32MB hasta el total de la 3 de PIA). Con incorporado del PIA es el exe 13KB .

En segundo lugar, incrustado PIA, la aplicación trabajó en una máquina con Oficina 2007 y 2010. y sin incrustado PIA, en WinXP + Office2007 que no sólo cuando el PIA no estaban en el directorio del exe.

Así que supongo que cualquier método, hay algún tipo de resolución dinámica? Y entonces por qué funcionó en un Win7 sin el PIA en el directorio exe, pero en WinXP fracasó (sólo cuando el PIA no estaban en dir del exe), hizo el cuadro de Win7 tiene del PIA Prolly desplegado algo a nivel mundial o?

Gracias
Gedeón

¿Fue útil?

Solución

No es tan común que en realidad necesita un PIA. Usted tiene que tener uno si se expone ningún tipo de interoperabilidad de la biblioteca de tipos de Excel en una de sus clases públicas. Esto va mal cuando otro código utiliza su clase y no utiliza la misma biblioteca de interoperabilidad. Un tipo en .NET sólo es idéntico cuando vinieron de la misma montaje. Se obtendría una difícil de interpretar mensaje de error como "No se puede lanzar una aplicación a otra". El PIA asegura que todo el mundo está utilizando el mismo tipo. Mientras todo el mundo está usando la misma versión del PIA, que en sí mismo es un problema difícil. Desplegar su propia DLL de interoperabilidad junto con su aplicación está muy bien si se puede evitar esto. Lo cual no es difícil en la mayoría de los escenarios.

Este problema se resolvió en .NET 4.0 a través de una característica denominada 'tipo equivalencia'. Es específico de tipos de interfaz COM, el CLR considera compatibles cuando tienen la misma [ía] y la misma declaración, sin importar lo que el montaje los contiene. Esto fue tomada entonces ventaja de la 'incrustar interoperabilidad tipos' característica (igual que 'no pia'), el compilador incrusta el tipos de interoperabilidad en los metadatos de su montaje. Sólo los que realmente utilizan.

Por lo que no tiene que enviar la biblioteca de interoperabilidad más y no necesita el PIA. Y es mucho menor, ya que sólo paga por los tipos que realmente usa. Eso es un mucho de la explosión de la pelota, muy recomendable.

Otros consejos

No he hecho mucho de interoperabilidad a mí mismo, pero yo creo que:

  • A veces el PIA puede ser bastante grande; si la aplicación en sí es bastante pequeña, el PIA puede enano que
  • El enfoque no-PIA es más flexible con respecto a versiones: mientras que sólo utiliza los miembros proporcionados por la versión del objeto COM que es realmente proporcionamos, usted está muy bien .. . Creo que, con el enfoque PIA, es necesario utilizar el PIA para la misma versión del objeto COM como el de la máquina de destino

Una de las cosas claves para entender acerca de NoPIA es que no embedd del PIA en su ensamblaje, sino que sólo se incrusta la parte de la PIA que utiliza su aplicación. Lo hace de una manera muy de grano fino (todo el camino hasta el nivel de método). El resultado es por lo general una reducción muy significativa en el tamaño de despliegue de la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top