Для сохранения динамической сборки в пользовательскую папку вы можете использовать перегруженный метод DefineDynamicAssembly в AppDomain
AppDomain currDom = AppDomain.CurrentDomain;
AssemblyName aName = new AssemblyName();
aName.Name = "YouAssemblyName";
string moduleName = aName.Name + ".dll";
AssemblyBuilder ab = currDom.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save, @"FOLDER\TO\YOUR\ASSEMBLY");
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, moduleName);
TypeBuilder tb = mb.DefineType("Example");
tb.CreateType();
// type definition here
ab.Save(moduleName);
Для автоматической загрузки сборки из пользовательского места вы можете использовать событие TypeResolve для AppDomain
AppDomain.CurrentDomain.TypeResolve += CurrentDomain_TypeResolve;
Assembly CurrentDomain_TypeResolve(object sender, ResolveEventArgs args)
{
return Assembly.LoadFrom(/*path to your saved assembly*/);
}
Хорошая папка для этой цели: driveletter: \ Users \\ AppData \ Local \ YourFolder.Используйте метод GetFolderPath, чтобы получить его путь:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
ps Я немного подправил пример из этого документа: https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.typeresolve?view=netframework-4.8
ОБНОВЛЕНО:
InitialВопрос был о том, как сохранить / загрузить динамическую сборку в / из пользовательского расположения.Но если необходимо определить динамический модуль и типы в памяти в одном AppDomain и вам не нужно сохранять динамическую сборку, то достаточно вызвать AssemblyBuilder.DefineDynamicAssembly с AssemblyBuilderAccess.Run , а затем определите переходный динамический модуль, используя метод AssemblyBuilder.DefineDynamicModule (string) .Наконец, вам нужно вызвать AssemblyBuilder.GetType (string, bool) , чтобы получить ваш тип.
Код будет выглядеть так:
AppDomain currDom = AppDomain.CurrentDomain;
AssemblyName aName = new AssemblyName();
aName.Name = "YourAssemblyName";
AssemblyBuilder assemblyBuilder = currDom.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run); // We need Run access, don't need Save access
ModuleBuilder mb = assemblyBuilder.DefineDynamicModule(aName.Name); // Here we define transient dynamic module in assembly
TypeBuilder tb = mb.DefineType("YourTypeName");
tb.CreateType();
// Define your type definition here
// ...
Type t = assemblyBuilder.GetType("YourTypeName", true); // Load created type using our AssemblyBuilder instance
Console.WriteLine("Loaded type \"{0}\".", t);
Object o = Activator.CreateInstance(t); // Create object of loaded type
Console.WriteLine("Created object \"{0}\".", o.ToString());