using System.Reflection.Emit;
using Blazor.Tools.BlazorBundler.Entities.SampleObjects.Models;
using Blazor.Tools.BlazorBundler.Extensions;
using Blazor.Tools.BlazorBundler.Interfaces;
using Blazor.Tools.BlazorBundler.Utilities.Exceptions;
public static void Main(string[] args)
DynamicallyCreateAssembly();
private static void DynamicallyCreateAssembly()
var contextAssemblyName = "Blazor.Tools.BlazorBundler.Interfaces";
var assemblyFileName = $"{contextAssemblyName}.dll";
var iViewModelTypeName = $"{contextAssemblyName}.IViewModel`2";
var tempPath = Path.GetTempPath();
var dllFilePath = $"{tempPath}.{contextAssemblyName}.dll";
var employeeTypeAssemblyName = "Blazor.Tools.BlazorBundler.Entities.SampleObjects.Models";
var employeeTypeName = $"{employeeTypeAssemblyName}.Employee";
var iModelExtendedPropertiesTypeName = $"{contextAssemblyName}.IModelExtendedProperties";
Type modelType = typeof(Employee);
Type modelExtendedPropertiesType = typeof(IModelExtendedProperties);
AssemblyName assemblyName = new AssemblyName(contextAssemblyName) { Version = new Version(version) };
PersistedAssemblyBuilder assemblyBuilder = new PersistedAssemblyBuilder(assemblyName, typeof(object).Assembly);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyFileName);
TypeBuilder typeBuilder = moduleBuilder.DefineType(
TypeAttributes.Public | TypeAttributes.Interface | TypeAttributes.Abstract,
GenericTypeParameterBuilder[] genericParamBuilders = typeBuilder.DefineGenericParameters(
$"{iModelExtendedPropertiesTypeName}"
Type createdType = typeBuilder.CreateTypeInfo().AsType();
assemblyBuilder.Save(dllFilePath);
var assembly = Assembly.LoadFile(dllFilePath);
Type loadedType = assembly.GetType(createdType.FullName ?? string.Empty) ?? throw new InvalidOperationException("Loaded type is null.");
var expectedType = typeof(IViewModel<Employee, IModelExtendedProperties>);
string createdTypeFullName = createdType.FullName ?? string.Empty;
string loadedTypeFullName = loadedType.FullName ?? string.Empty;
Console.WriteLine($"Expected Full Name: {expectedType.FullName}");
Console.WriteLine($"Created Full Name: {createdTypeFullName}");
Console.WriteLine($"Loaded Full Name: {loadedTypeFullName}");
loadedType.DisplayTypeDifferences(expectedType);
bool match = createdTypeFullName == expectedType.FullName && loadedTypeFullName == expectedType.FullName;
Console.WriteLine(match ? "The types match." : "The types do not match.");
AppLogger.WriteInfo(ex.Message);