2012-06-07 19 views
6

En nuestro proyecto estamos reutilizando muchos códigos Delphi a través de COM en nuestra aplicación asp.net.¿Por qué se prefiere la interoperabilidad de COM sobre P/Invoke en .NET?

De esta manera: el legado Delphi dll => Delphi COM envoltorio => .Net interoperabilidad => asp.net (MVC)

Tenemos algunos problemas con respecto a violaciónes de acceso, descarga de DLL, etc ... tengo ahora portado algunos para usar el DLL heredado directamente a través del código P/Invoke.

Cuando miro los recursos con respecto a COM y P/Invoke, las personas casi siempre aconsejan usar COM. ¿Porqué es eso? ¿No P/Invoke tiene los siguientes beneficios:

  • marchamos código siempre utilizará el DLL correcta del lugar del último COM registrada
  • Múltiples versiones pueden correr al lado del otro en los servidores (por ejemplo, : DEV, TEST y QA)
  • No más registros COM molestia
  • mucho más rápido que la comunicación COM (artículos que leí indican un aumento de velocidad del 30%)
+0

¿se puede p/invocar en un dll de 32 bits desde un proceso de 64 bits? No lo creo. – Bond

+1

¿Podría dar algunas referencias que sugieren que se prefiere COM a P/invocar? Estoy totalmente de acuerdo con usted en que P/Invoke es la mejor solución cuando está disponible. La mayoría de las partes internas de .NET BCL se implementan en términos de P/Invoke a las API de Win32. La única razón para usar la interoperabilidad COM es cuando no tiene otra opción, p. interoperabilidad con aplicaciones de Office o Windows API que son COM-only. – Govert

+0

¿Recuerdas el infierno de DLL? En lugar de usar el dll correcto, su código usará el primer dll disponible con el mismo nombre. Cualquier cambio en la API no se detectará hasta el tiempo de ejecución, lo que significa que las versiones son casi imposibles. No se puede crear una DLL que sirva tanto a los clientes más antiguos como a los más nuevos sin cambiar los nombres de las funciones en sí –

Respuesta

8

Pinvoke es una herramienta muy agradable pero sin duda es norte o sustituir a COM. Pinvoke solo admite funciones simples con una sintaxis de C, COM le permite implementar un modelo de objetos. Tome las clases en los espacios de nombres de Microsoft.Office.Interop, por ejemplo, todas son clases COM puras sin envoltorios. Hacer la interoperabilidad de Office con pinvoke sería insoportablemente doloroso.

Otro problema central con Pinvoke es que normalmente es la carga del programador cliente escribir las declaraciones. La persona con menos probabilidades de hacerlas bien. Un autor COM puede publicar una biblioteca de tipos generada automáticamente, al igual que los metadatos en un ensamblado .NET. Elimina drásticamente las probabilidades de errores y el programador cliente no necesita trabajo más allá de Proyecto + Agregar referencia.

Abordar las balas:

  • sacados código utilizará siempre en lugar de la DLL correcta de la última COM registrada
    Usted está aún sujeta a los caprichos de la de Windows para encontrar el archivo DLL adecuada. La única buena manera de evitar accidentes es almacenar el archivo DLL en el mismo directorio que el EXE. Que es bastante posible en COM, así, todo lo que tiene que hacer es crear un archivo vacío con el nombre yourapp.exe.local

  • Múltiples versiones pueden correr al lado del otro en los servidores (por ejemplo: DEV, TEST y QA)
    no es un problema en el COM o bien, mediante la técnica por encima o mediante el uso de un libre-registro se manifiestan

  • no más registros COM molestaban
    usar un manifiesto sin reg lo que no requiere registro. Muy simple de hacer, simplemente establezca la propiedad Aislada de la referencia en True.

  • Mucho más rápido que la comunicación COM (artículos que he leído indican un aumento de velocidad del 30%)
    Es mucho más lenta de COM. Puede incurrir en un costo adicional al realizar llamadas COM con destino tardío a través de IDispatch, que es más o menos tan caro como una llamada pinvoke.


Hay una tercera manera de hacer interoperabilidad código nativo: escribir un envoltorio clase administrada en el lenguaje C++/CLI. La técnica se usa mucho en .NET Framework, particularmente en mscorlib.dll, System.Data y PresentationFramework, ensambles que tienen fuertes dependencias en el código nativo. Sin embargo, no muy adecuado para Delphi, funciona mejor para el código nativo que se puede llamar fácilmente desde C o C++.

+0

Gran respuesta. Probé un manifiesto sin registro, pero no pude hacerlo funcionar, al menos no desde Visual Studio (propiedad aislada). No estoy seguro de cómo "yourapp.exe.local" cambia el comportamiento de encontrar el COM correcto? – Cohen

+0

No sé cómo responder preguntas "no funciona". El archivo .local simplemente le dice al cargador de Windows que solo busque en el directorio que contiene el EXE, independientemente de la ruta especificada en la clave de registro. Crudo y no sustituto de un manifiesto, pero sin duda puede ser útil. –

+0

preguntas '' no funciona ''. Entiendo. Tendré que buscar más en los archivos manifiestos. No creo que .local sea una solución en un entorno asp.net. El exe en este caso sería el proceso de trabajo de IIS, si no me equivoco? – Cohen

Cuestiones relacionadas