desarrolloMobile.NET Noticias

miércoles, febrero 23, 2005

Interoperabilidad no administrada y migración I

dotNetMania
Primero de una serie de tres artículos acerca de la interoperabilidad con código no administrado y estrategias de migración, ya publicado en dotNetManía número 12. En la web www.dotnetmania.com podrás encontrar el código referente al ejemplo del artículo.

5 comentarios:

Anónimo dijo...

Le felicito por su excelente artículo de DotNetMania.

Quisiera saber si en los próximos artículos entrará en detalle en las instalaciones de un proyecto .NET que haga uso de objetos COM, y por ello de esas librerías Interop.xxxx.

Por ejemplo, me refiero al caso de Office. Desde Visual Studio puedes agregar referencias a COM Object Library Application Word (o nombre similar) y el Visual Studio genera el wrapper como usted indicó en su artículo.

Bien, en desarrollo funciona bien porque el Office y Visual Studio estaría instalado en el mismo equipo.

La cuestión sería en la instalación en otro equipo, qué pasaría si Office no está instalado, pues aunque esté Interop.XXX no funcionaría, supongo.
Me parecería muy interesante que entrara en profundidad en esos casos, si se puede determinar en un equipo si tiene Office instalado, o qué pasaría si no lo está y se ejecuta la aplicación. En fin, muchas preguntas tengo.

Un saludo y enhorabuena.

José Miguel Torres dijo...

En primer lugar muchas gracias.

En la siguiente entrega no saldrá de forma explícita lo que usted está comentando. Me explico...

Si instalara una aplicación que utiliza un objeto COM y por ello su aplicación necesita un Wrapper correspondiente deberia tener en cuenta dos cuestiones.

En primer lugar si el objeto COM es distribuible legalmente. Desconozco si los de Office lo son.

En segundo lugar si lo fuera el instalador lo registraría y no habría ningún problema, si no lo fuera entonces deberíamos 'esperar' que el cliente tuviera dichos objetos COM. Si los tuviera deberíamos crear el Wrapper de manera dinámica, es decir, desde código. Con lo cual la aplicación en ejecutarse preguntaría mediante reflexión si el ensamblado de interoperabilidad primaria está o no disponible, si es que no lo crearíamos. En la tercera entrega mostraré un ejemplo de como crear dicho ensamblado de interoperabilidad.

Espero haberle ayudado, para cualquier duda no dude en consultarmelo.

Saludos y muchas gracias.

Anónimo dijo...

No sé cómo se registrará un COM desde un instalador. Quizá desde unproyecto de instalación de VS haya alguna opción para incluir el fichero COM y luego hacer el regsvr32 del COM.

Supongo que desde la aplicación habría que localizar la Interop.xxx.dll, que estaría en /bin (para web) o en directorio del ejecutable EXE (para Windows). Todo ello por reflexión.

Y posteriormente, sino no se encuentra el Interop, localizar el COM de alguna manera y desde la aplicación .NET realizar la creación del Interop, como usted expuso maravillosamente en dotnetmania.

Algo más que haya que considerar en todo este proceso ?

José Miguel Torres dijo...

Hola, un componente COM con un instalador se registra automáticamente si se le especifica explícitamente, es decir que un componente como archivo tiene la posibilidad de registrarse. La locacalización del archivo COM también se puede cambiar, de esta manera podemos hacer que un archivo dll basado en COM se copie en el directorio X y que además se registre. De esta forma sabemos que desde nuestra aplicación .NET se encuentra en el directorio X. La interop.xxx.dll estaría ya referenciada en tu proyecto así que si el componente COm se ha registrado no tendrás ningún problema, es más, te dará lo mismo donde esté ubicado.

Muchas gracias, y si te queda alguna duda no dudes en preguntar.
Saludos

Anónimo dijo...

Hola, tengo una librería dll Win32 creada con Fortran, según la documentación. Tiene varias funciones a utilizar.

En la misma aparecen ejemplos para utilizarla con VBasic 6.0:

GET_ACCESSORY
Declare Sub GET_ACCESSORY Lib "Nicotra.dll" (ByRef KEY As keytype, ByRef LG As
Integer, ByRef List As TypeLista)
……
Dim KEY As keytype, LG As Integer, Lista As TypeLista
……
Call GET_ACCESSORY(KEY, LG, Lista)


He intentado utilizarla en C# y he puesto algo así:

[DllImport(path)]
public extern static void GET_ACCESSORY (ref keytype KEY, ref int LG, ref TypeLista List);

Al ejecutar me aparece este error:

no se pueden calcular referencias de parameter #3: la definición de este tipo no tiene información de presentación


Puedo suponer que hago mal conversión de tipos, o algo así pero estoy perdido con la interoperabilidad.

Alguna sugerencia? Se lo agradecería.