2011-02-28 15 views
8

Necesito automatizar documentos de oficina (Word & Excel) desde mi aplicación .Net4.C# .Net4: objetos COM (dinámicos) correctamente desechables

Dado que realmente no puedo forzar a mis usuarios a usar una versión específica de Office, no utilizo ensamblados de interoperabilidad o tlbimp, por lo que mi proyecto no contiene referencias adicionales ni fallará toda la aplicación si Office no está instalado (la función simplemente no estará disponible).

En lugar de eso pedir al sistema que el servidor COM puede manejar "Word.Application" o "Excel.Application":

dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application")); 
app.Foo(); 

Me preocupa cómo deshacerse adecuadamente del objeto "aplicación" cuando estoy Terminé con esto, ya que ahora tengo que preocuparme por dos sistemas de administración interna (recuento de referencias COM y seguimiento de referencia .Net). Idealmente, debería ser capaz de ajustar el objeto dinámico de la aplicación en una clase de contenedor desechable y asegurarme de que el objeto COM subyacente no se referencia cuando se descarta el contenedor.

EDITAR: También me gustaría saber cómo hacer correctamente el objeto COM "en vivo" cuando haya terminado con él, ya que Word está en un proceso separado. Debería poder instanciar la aplicación Word, automatizarla y luego liberar todas mis referencias, pero la aplicación Word debería permanecer abierta.

+0

posible duplicar: http://stackoverflow.com/questions/2203968/how-to-access-microsoft-word-existing-instance-using-late-binding –

+2

No necesariamente, el candidato duplicado es más sobre el lado de instanciación de COM desde C#, esta pregunta es acerca de la eliminación. –

+0

Asegúrese de deshacerse de cualquier objeto COM intermediario también - http://stackoverflow.com/a/158752/188926 – Dunc

Respuesta

7

Definitivamente implementaría IDisposable y llamo al Marshal.ReleaseComObject dentro de él. Asegúrese de correctly implement the disposable pattern para evitar liberar el objeto COM más de una vez y reducir el recuento de referencias más de lo debido, aunque esto puede no importar si solo va a crear una instancia del objeto COM. He implementado este patrón con éxito en el pasado, así que definitivamente te estás dirigiendo en la dirección correcta.

I think Word permanecerá abierto incluso cuando el último objeto COM sea referencia contada a 0 en su aplicación, a menos que explícitamente le pida que salga. (Word.Application.Close()?)

+0

Entonces, en el ejemplo que enlazó, debería reemplazar Marshal.FreeHGlobal (nativeResource) con Marshal.ReleaseComObject (app)? ¿Eso es? –

+0

No necesita el bloque if() a su alrededor, por supuesto, y las cosas de managedResource pueden ser irrelevantes para su caso de uso, pero eso sí debería limpiar adecuadamente su referencia COM. Te recomiendo que no pases tu envoltorio IDisposable alrededor de tu código para minimizar el resto de la exposición de tu sistema a este identificador particular. –

Cuestiones relacionadas