На Linux существует по крайней мере два традиционных метода:
По сути, Вы не только ловите новый и удаляете, но также и функции выделения памяти C-стиля. Я еще не сделал этого на окнах, но я видел методы, чтобы переписать, как DLLs связаны там также (хотя я вспоминаю, что они были довольно неуклюжи).
Примечание однако, что кроме того, что это интересные методы, я рекомендовал бы использовать valgrind, чтобы сделать то, что Вы хотите выше чего-либо еще.
вы можете использовать событие AppDomain.AssemblyResolve для добавления настраиваемых преобразователей сборки. Это позволяет вам указывать на другие каталоги или даже базы данных для получения сборок по мере необходимости.
Я даже использовал аналогичный код для загрузки сборок из базы данных и хранения в IsolatedStorage. Имя файла в виде хеша от полного имени сборки. Тогда базу данных нужно будет загрузить только при первом разрешении, и все будущие разрешения будут обслуживаться файловой системой. Самое лучшее в событии AssemblyResolve - это то, что вы можете использовать его Type.GetType () и встроенные сериализаторы.
static string lookupPath = @"c:\otherbin";
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender,
ResolveEventArgs args)
{
var assemblyname = new AssemblyName(args.Name).Name;
var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
var assembly = Assembly.LoadFrom(assemblyFileName);
return assembly;
}
См. Это обсуждение для некоторых из затронутых проблем:
http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading
В основном , вы не можете изменить базу приложений appdomain после его создания. Вы должны указать это как часть конфигурацию перед созданием новой, которая не поможет вам по умолчанию appdomain.
Если сборка, которую вы хотите загрузить, находится в каталоге ниже текущего appbase, вы можете добавить его относительный путь, используя AppendPrivatePath (relativePath), а затем используйте Assembly.Load - среду выполнения проверит подкаталоги за вас. Это лучший / самый простой способ справиться.
System.Reflection.Assembly.LoadFrom(myFile);
http://msdn.microsoft.com/en-us/library/1009fa28.aspx
Другой альтернативой является самостоятельная обработка событий разрешения сборки, как в этом вопросе StackOverflow: Как добавить папку в путь поиска сборки во время выполнения в .NET?