Creé una aplicación de formulario web vacía que se ejecuta en .Net Framework 4.7.2 y creé un formulario web y una clase llamada MyClass :
namespace WebApplication1 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } public string GetText() { return "Message of Web Form 1"; } } }y:
namespace WebApplication1 { public class MyClass { public string GetText() { return "Message from MyClass"; } } }y lo publico usando la opción "Combinar todos los ensamblajes en un ensamblaje":

Luego quiero obtener el tipo y luego crear una instancia de WebForm1 y MyClass .
Escribí este código en una aplicación de consola que se ejecuta bajo .Net 5 :
Assembly asm = Assembly.LoadFrom(@"C:\Pub\bin\WebApplication1.dll"); Type tMyClass = asm.GetType("WebApplication1.MyClass"); Type t = asm.GetType("WebApplication1.WebForm1"); <----Error Después de ejecutar el código, tMyClass tiene el tipo correcto:
]
pero cuando trato de obtener el tipo de WebForm1 , aparece un error:
System.TypeLoadException: 'No se pudo cargar el tipo 'System.Web.UI.Page' del ensamblado 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.'
¿Cómo puedo obtener el tipo de WebForm1 y crear una instancia de él?
Carga un ensamblado integrado en .NET Framework a través de la reflexión en .NET Core , pero algunas de las clases en el espacio de nombres System.Web no son compatibles con .NET Core . Carga partes del código de usuario. Y otras partes pueden no funcionar. En su caso, la clase solicitada del código compilado para .NET Framework no forma parte de .NET Core . System.Web es para Asp.Net y en .NET Core existe el espacio de nombres System.Web y técnicamente podría llamarse, pero no funcionará como usted desea.
El motivo del error es que System.Web.UI.Page no existe en .NET 5. Por lo tanto, no puede cargar el ensamblado con el fin de ejecutar el código dentro de su aplicación de consola.
Sin embargo, aún puede cargar los metadatos de su clase WebApplication1.WebForm1 en un contexto de solo reflexión con el fin de examinar el tipo. La forma en que lo hace en .NET 5 es diferente a la de .NET Framework mediante el uso de un MetadataLoadContext de este paquete NuGet .
var dllPath = @"C:\Pub\bin\WebApplication1.dll"; var paths = new List<string>(); paths.AddRange(Directory.GetFiles(Path.GetDirectoryName(dllPath), "*.dll")); paths.AddRange(Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll")); using var context = new MetadataLoadContext(new PathAssemblyResolver(paths)); var asm = context.LoadFromAssemblyPath(dllPath); var yourType = asm.GetType("WebApplication1.WebForm1");También tenga en cuenta que si está intentando acceder a los métodos que están definidos en un ensamblaje no cargado, seguirá recibiendo un error:
yourType.GetMethods(); // Error yourType.GetMethods(BindingFlags.DeclaredOnly); // OK