Hemos creado un pequeño componente que toma una identificación, busca una entrada en la base de datos para un ensamblado/espacio de nombres/clase y carga dinámicamente una instancia de la clase que estamos después. Ha funcionado bien hasta ahora, pero cuando se ejecuta este código en VS 2010, está fallando.Problema con la carga dinámica de ensamblados en .NET
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
If (asmb.Location = assemblyFile)) Then Return asmb
Next
Return Nothing
End Function
El primer problema es que cuando el repetidor realiza un ensamblado dinámico, no hay asmb.Location, y una NotSupportedException es lanzada. ¿Hay alguna manera de verificar el campo No admitido del Lugar sin tener que atrapar la excepción?
El segundo problema, asmb.Location es devolver la ruta completa en lugar de solo el nombre de archivo, lo que significa que esta función falla cada vez. Si esta función determina que una clase no está cargada, trataremos de cargarla y obtendremos una AccessViolationException porque la clase ya se ha cargado y no podemos "volver a cargarla".
Cambio de la función para que esto funcione:
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
Try
If (asmb.Location.EndsWith(assemblyFile)) Then Return asmb
Catch ex As NotSupportedException
Continue For
End Try
Next
Return Nothing
End Function
pero se siente sucio. ¿Hay una mejor manera de verificar si un ensamblado ya está cargado y devolverlo a la persona que llama? ¿Los problemas anteriores son específicos de .NET 4.0 o Visual Studio 2010? No he intentado esto fuera del IDE ya que requiere una configuración bastante significativa.
Esto funciona, gracias. Quité el .ToLower por brevedad, pero tratamos con la sensibilidad de mayúsculas y minúsculas. –