Principales respuestas
Problema con GetReferencedAssemblies

Pregunta
-
Estoy migrando unas aplicaciones de VS 2003 a VS 2005 con VB.NET, es una aplicación de escritorio MDI, tengo una solución con distintos proyectos, uno de ellos es donde está el formulario principal y donde se genera el .exe, tengo referenciados los assemblies, pero algunos de ellos no los uso en dicho proyecto. El problema que con el Framework 1.1 GetReferencedAssemblies me cogía todas las referencias se usaran o no, sin embargo con el Framework 2.0 no. El código donde ahora falla es el que muestro, necesito comprobar si está referenciado la dll donde se encontrará el objeto (un formulario o listado de otros proyectos de la solución) que queremos cargar, pero si no uso esa dll en el proyecto inicial pasa. Puedo hacer una ñapa creando una variable de la referencia que no se usa y luego igualarla a Nothing, y con eso si me funciona, pero no me parece correcto.
Esto es debido a que el manifiesto de la aplicación es distinto a lo que vemos con las referencias del proyecto en tiempo de diseño. Ya lo he comprobado con ildasm.exe.
Me gustaría saber si hay algún método para obtener referencias que no se usan de un proyecto.
asm2 = [Assembly].GetEntryAssembly
For Each ana In asm2.GetReferencedAssemblies If sClase.StartsWith(ana.Name) Thenasm1 = [Assembly].Load(ana.Name)
Dim formObject As Type = asm1.GetType(sClase) Dim formActivator As Object = Activator.CreateInstance(formObject)frm =
DirectCast(formActivator, Form) If frm Is Nothing ThenMessageBox.Show(
"No se puede encontrar " & sClase, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error) End If Exit For End If Next
Respuestas
-
Al final de investigar, la única solución es crearme una instancia de alguna clase del ensamblado que no se está cargando dentro del Load del formulario MDI.
Dim
cargoListados As Listados.Marca.flMarca = Nothing 'Donde flMarca es un formulario que contiene un report y Listados pertenece al assembly que no se me carga en principioTodo esto se debe a que en 2003, si ejecutaís ILDASM podréis comprobar que en el manifiesto se cargan todas la referencias, se usen o no. Sin embargo en 2005 ha cambiado, ejecutando ILDASM comprobaréis que sólo se cargan las que se usan. Y por lo que deduzco, GetReferencedAssemblies comprueba el manifiesto del ensamblado.
Si alguno encuentra otra solución menos "idea feliz" que la que yo he encontrado lo puede comentar, pero yo ya me doy por respondida.
Gracias.
Todas las respuestas
-
Al final de investigar, la única solución es crearme una instancia de alguna clase del ensamblado que no se está cargando dentro del Load del formulario MDI.
Dim
cargoListados As Listados.Marca.flMarca = Nothing 'Donde flMarca es un formulario que contiene un report y Listados pertenece al assembly que no se me carga en principioTodo esto se debe a que en 2003, si ejecutaís ILDASM podréis comprobar que en el manifiesto se cargan todas la referencias, se usen o no. Sin embargo en 2005 ha cambiado, ejecutando ILDASM comprobaréis que sólo se cargan las que se usan. Y por lo que deduzco, GetReferencedAssemblies comprueba el manifiesto del ensamblado.
Si alguno encuentra otra solución menos "idea feliz" que la que yo he encontrado lo puede comentar, pero yo ya me doy por respondida.
Gracias.
-
Hola Carmen:
No se si todavia te sirva lo siguiente: Tu tema me sirvio para resolver mi problema que tenia Gracias, A mi ya me funciono de esta manera sin la instanciacion inicial de que hablas en tu solucion (No practica)
Imports
SystemImports
System.Reflection (Esto solo para recordar que debe estar al principio de la clase)Dim
sClase As String Dim asm2 As [Assembly]asm2 = [Assembly].GetEntryAssembly
Dim mitipoloc As Type() = asm2.GetTypes Dim tlocal As Type For Each tlocal In mitipoloc If tlocal.Name = "LoginForm1" Then 'forma que pertence al proyecto local o assembly local Dim objNewFormlocal As Object = Activator.CreateInstance(tlocal) Dim frmlocal As Form = DirectCast(objNewFormlocal, Form)frmlocal.Show()
Exit For
End If Next tlocalComo veras este te sirve para tus formas locales o del assembly padre ahora para relacionar los demas proyectos o assemblys hice lo siguiente
sClase =
"InterOtro" 'este es el otro assembly o proyectoDim
a As [Assembly] = [Assembly].Load(sClase) Dim mytypes As Type() = a.GetTypes() Dim t As Type For Each t In mytypes If t.Name = "FormAbrir" Then Dim objNewForm As Object = Activator.CreateInstance(t) Dim frm As Form = DirectCast(objNewForm, Form)frm.Show()
Exit For
End If Next tHasta Luego