2010-02-03 11 views
7

Construyo un ensamblado que hace referencia a una DLL de interoperabilidad COM. Si incorporo los tipos de interoperabilidad COM configurando Tipos de interoperación incrustados en True en las propiedades de la Referencia (VS2010), en el tiempo de ejecución se produce un error "el objeto no contiene una definición para get_Range". Si los tipos de interoperabilidad COM no están integrados, entonces no se produce ningún error.Excel get_Range falta cuando el ensamblado de interoperabilidad está incrustado en .NET 4.0

¿Alguien sabe por qué se debe omitir un método en particular, Worksheet.get_Range o cómo solucionar esto o tener alguna otra información relevante? Debo estar agradecido por cualquier ayuda.

La interoperabilidad dll contiene una referencia a Worksheet.get_Range (object, [object]). Utilizando el reflector en mi conjunto de llamadas no se menciona get_Range en la Hoja de trabajo.

El ensamblado de interoperabilidad que estoy incrustando se genera desde Excel9.olb. No estoy usando PIA ya que la aplicación se dirige a múltiples versiones de Excel.

Respuesta

10

Aún no lo he probado, pero creo que la sintaxis ha cambiado al usar los tipos incrustados COM Interop en C# 4.0 a una sintaxis más "amigable con C#".

Por lo tanto, en lugar de buscar el método get_Range(object, [object]), puede omitir el parámetro opcional (en lugar de tener que proporcionar Type.Missing), o se puede evitar llamar al acceso get por completo, y en lugar de hacer referencia al nombre de la propiedad utilizando corchetes:

// Using C# 3.0: 
Excel.Range range = worksheet.get_Range("A1", Type.Missing); 

// Using C# 4.0, omitting the optional parameter: 
Excel.Range range = worksheet.get_Range("A1"); 

// Using C# 4.0, utilizing square-bracket indexing: 
Excel.Range range = worksheet.Range["A1"]; 

Por lo que entiendo, sin embargo, aún debe ser capaz de llamar a la "vieja manera", donde la nueva sintaxis indexador es realmente llama la y 'set' de acceso requerido 'conseguir' detrás de las escenas, así que realmente no sé por qué estás teniendo problemas. Supongo que debe buscar en Worksheet.Range en lugar de Worksheet.get_Range en la lista de IntelliSense. Si esto no funciona para usted, entonces parece que algo puede estar mal con su configuración o instalación.

Para más información sobre esto, ver: Indexed Properties in C# 4.0 por Kirill Osenkov.

Espero que esto ayude ...

Mike

+0

MIke, gracias por su ayuda. El enfoque de parámetro único no obtiene un error en tiempo de ejecución y obviamente es una buena solución. He enviado un informe de error a Microsoft 530769. – mikemay

+1

https://connect.microsoft.com/VisualStudio/feedback/details/530769/get-range-method-missing-with-embedded-interop-assembly?wa=wsignin1.0 – mikemay

+0

Ah, claro, publiqué un enlace incorrecto en mi comentario anterior, gracias por corregir eso. La discusión allí es muy interesante, y tiene sentido. Pero, puedo preguntar, ¿no es la solución más fácil ahora simplemente usar la sintaxis 'worksheet.Range [" A1 "]' en lugar de la anterior 'worksheet.get_Range (" A1 ", Type.Missing)' ahora que eres usando C# 4.0? Ha encontrado una curiosidad muy interesante, pero en cuanto a arreglarla para su propio código, parecería más fácil y mejor simplemente usar la nueva sintaxis, que es más fácil de leer en cualquier caso (¡por diseño!). –

Cuestiones relacionadas