Поиск блока.NET в другом месте [дубликат]

На Linux существует по крайней мере два традиционных метода:

  • malloc () и свободный () (и другие связанные с памятью функции) являются слабыми символами, что означает, что можно просто повторно реализовать их, и версии будут использоваться. Для примера реализации: посмотрите электрический забор.
  • С переменной среды LD_PRELOAD, можно переопределить символы (и слабый и сильный) символы в общих библиотеках с символами, найденными в библиотеках, содержавшихся в переменной среды LD_PRELOAD. При компиляции общей библиотеки с malloc (), свободный () и друзья, Вы все установлены. Снова, электрический забор демонстрирует это.

По сути, Вы не только ловите новый и удаляете, но также и функции выделения памяти C-стиля. Я еще не сделал этого на окнах, но я видел методы, чтобы переписать, как DLLs связаны там также (хотя я вспоминаю, что они были довольно неуклюжи).

Примечание однако, что кроме того, что это интересные методы, я рекомендовал бы использовать valgrind, чтобы сделать то, что Вы хотите выше чего-либо еще.

6
задан MusiGenesis 13 October 2009 в 17:48
поделиться

3 ответа

вы можете использовать событие 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;
}
9
ответ дан 8 December 2019 в 17:23
поделиться

См. Это обсуждение для некоторых из затронутых проблем:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

В основном , вы не можете изменить базу приложений appdomain после его создания. Вы должны указать это как часть конфигурацию перед созданием новой, которая не поможет вам по умолчанию appdomain.

Если сборка, которую вы хотите загрузить, находится в каталоге ниже текущего appbase, вы можете добавить его относительный путь, используя AppendPrivatePath (relativePath), а затем используйте Assembly.Load - среду выполнения проверит подкаталоги за вас. Это лучший / самый простой способ справиться.

3
ответ дан 8 December 2019 в 17:23
поделиться
System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library/1009fa28.aspx

Другой альтернативой является самостоятельная обработка событий разрешения сборки, как в этом вопросе StackOverflow: Как добавить папку в путь поиска сборки во время выполнения в .NET?

2
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: