none
Problema con GetReferencedAssemblies RRS feed

  • 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) Then

          asm1 = [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 Then

             MessageBox.Show("No se puede encontrar " & sClase, Application.ProductName, MessageBoxButtons.OK,    MessageBoxIcon.Error)

          End If

          Exit For

       End If

    Next

    miércoles, 1 de agosto de 2007 11:04

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 principio

     

    Todo 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.

    jueves, 2 de agosto de 2007 7:32

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 principio

     

    Todo 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.

    jueves, 2 de agosto de 2007 7:32
  • 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 System

    Imports 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 tlocal

     

    Como 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 proyecto

    Dim 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 t

     

     

    Hasta Luego

     

    viernes, 6 de junio de 2008 22:35