2010-06-10 18 views
8

tengo un programa de actualización, los archivos extraídos del servidor han mezclado vb6 dll y .net dll en un directorio. cómo determinar si un dll es un COM? (así que puedo invocar regsvr32 desde el programa de actualización)Cómo determinar si DLL es COM o .NET?

+0

¿Por qué no hacer lo correcto y registrar los que usted sabe que son servidores COM y omitir los que no lo son? Debería tener esa información y puede codificarla en su instalador. – Tim

+0

@Tim - Supongo que podría haber una situación en la que los editores del código no sean la misma organización que los consumidores; de lo contrario, estoy de acuerdo: controlen el proceso de manera explícita. –

+0

@AJ - eso todavía no significa que uno no pueda resolverlo y probarlo. Mi punto es que si es parte de su proceso de instalación, usted debe SABER lo que debe registrarse. No hacerlo es descuidado y poco profesional. Es una prueba simple hacerlo de antemano. ¿Por qué querría agregar código cuando todo lo que necesita hacer es determinar de antemano? – Tim

Respuesta

6

Supongo que una forma de hacerlo sería intentar cargar el archivo con System.Reflection.Assembly.LoadFile(). Si obtiene una BadImageFormatException, no es un ensamblado .NET válido. Probablemente haya una manera más clara de hacer esto, pero esto debería funcionar.

http://msdn.microsoft.com/en-us/library/b61s44e8.aspx

+0

Parece mucho trabajo escribir un instalador que haga esto en lugar de rastrear cuidadosamente qué DLL deben registrarse. Pero +1 de todos modos – Tim

2

¿Por qué no llaman regsvr en todos ellos. Si se registran, entonces está bien, si no fuera poco.

Probablemente sea mejor escribir un instalador que tenga el conocimiento de cuáles son los que y hace lo correcto para cada uno.

EDITAR

Si usted está preocupado por los "errores" que emiten, no se preocupe.

See this usage

Puede suprimir los mensajes. (s)

+0

[@Hao] (http://stackoverflow.com/users/55327/hao) - a pesar de mi respuesta alternativa, estoy de acuerdo con Tim. –

+0

@AJ: el problema con regsvring ciegamente, si el DLL es del tipo .NET, el regsvr32 emite un error – Hao

+1

http://support.microsoft.com/kb/249873 - use el indicador silencioso ... – Tim

5

Para hacer esto formalmente, puede inspeccionar el PE para obtener más información sobre qué tipo de cosas exporta cada dll. Hay a pretty interesting article on MSDN que habla sobre la estructura. Si comprende la configuración, puede identificar enlaces a .Net (y por lo tanto, la falta que indica un dll COM puro).

+0

Me quedé sin votos hoy. Volveré y votaré esta. Es una buena respuesta técnica. – Tim

+0

@ [Tim] (http://stackoverflow.com/users/26177/tim) - gracias :) Esto no es para corazones débiles, pero con un poco de esfuerzo podría proporcionar una solución bastante sólida.Si el escenario es algo más alto que el montaje, este enfoque debería ser confiable (léase: no hay demasiados PE "optimizados" para tratar). –

Cuestiones relacionadas