2008-10-22 51 views
11

Al agregar una referencia a Microsoft.Office.Interop.Excel en mi equipo, Visual Studio agrega esto al archivo de proyecto:diferentes referencias de interoperabilidad en dos equipos diferentes no funciona

<COMReference Include="Excel"> 
    <Guid>{00020813-0000-0000-C000-000000000046}</Guid> 
    <VersionMajor>1</VersionMajor> 
    <VersionMinor>5</VersionMinor> 
    <Lcid>0</Lcid> 
    <WrapperTool>primary</WrapperTool> 
    <Isolated>False</Isolated> 
</COMReference> 

Hay es otro desarrollador en el equipo que recibe errores y necesita agregar un archivo DLL en el proyecto llamado Interop.Excel.dll, que sustituye el código anterior con esto en el archivo del proyecto:

<Reference Include="Interop.Excel, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>My Project\Interop.Excel.dll</HintPath> 
</Reference> 

esto funciona en mi computadora.

¿Podría explicar las diferencias entre los dos métodos, cuál es el mejor, y cómo hacer que el primero funcione en otras computadoras?

Respuesta

0

He usado la automatización de Excel mucho más de lo que me gustaría admitir, y nunca he hecho referencia a Interop.Excel.dll. Siempre he hecho referencia al primero. ¿Por qué está haciendo referencia a eso y qué errores obtiene?

¿Están refiriéndose a la misma versión de Excel (5.0 versos 11.0)? ¿Ustedes tienen exactamente la misma versión de oficina, paquetes de servicio y todo? Esta podría ser la différance.

12

No veo ningún problema con su enfoque tampoco.

Normalmente, VS generará un conjunto de interoperabilidad para los componentes COM automáticamente cuando agrega una referencia al componente. Sin embargo, cuando agrega una referencia a uno de los componentes de Office (XP o cualquier versión posterior), se agrega una referencia al ensamblado de interoperabilidad primario pregenerado (y optimizado) de Microsoft como en su primer ejemplo. La línea

<WrapperTool>primary</WrapperTool> 

significa que se utiliza este PIA.

Si ha añadido correctamente el PIA hacen referencia al CopyLocal propiedad de esta referencia se debe establecer en falso y la propiedad ruta debe ser algo así como

C:\WINDOWS\assembly\GAC\Microsoft.Office.Interop.Excel\12.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll 

usted encontrará algunos detalles más sobre ensamblados de interoperabilidad en este MSDN article.

Para que funcione el primer método, es necesario que los Ensambles de interoperabilidad primarios de Office (PIA) estén instalados en la máquina. Hay una versión redistribuible de Microsoft:

yo sepa, estos los PIA sólo se les instalaron en la instalación de Office cuando el .NET Framework ya se ha instalado, por eso hay es una redistribución separada para los PIA.

Nota: asegúrese de hacer referencia a la versión de Office a la que se dirige. Sin embargo, al orientar varias versiones de Office, es posible que tenga algunos problemas. Una solución en ese caso podría ser la vinculación tardía (si el rendimiento no es un problema).

+1

También tenga en cuenta que los PIA contienen un código de pegamento adicional que evita las fugas de memoria/recursos que podrían ocurrir al usar los conjuntos de interoperabilidad generados. –

+0

¿Cómo puedo asegurarme de que se use el PIA y no la interoperabilidad generada? Creo que estoy viendo las fugas de memoria/recursos mencionadas en el comentario de @David Schmitt –

+0

@ user260197: El PIA debe estar instalado correctamente en el sistema. Puede obtener una configuración de Microsoft que se encargará de la instalación. Es especialmente importante que el PIA esté en el GAC y * registrado *. Vea los detalles en http://msdn.microsoft.com/en-us/library/aa679806%28office.11%29.aspx –

0

Encontré la forma más limpia de usarlo, esto también permite múltiples versiones de la interoperabilidad, es crear un bin compartido \ Office Interop \ 11 o 12 \ Microsoft.Office.Interop.Excel.dll \ y hacer referencia a ellos del proyecto, funciona como un regalo para la versión diferente

Cuestiones relacionadas