Попытки перебазирования Dll в.net4 не работают
Я экспериментирую с перекомпоновкой Dll на небольшом тестовом решении, работающем на.net4, состоящем из одного маленького.exe и трех маленьких.Dll. Ссылки на сборки были установлены правильно, и программа компилируется и работает очень хорошо.
Цель этого упражнения - изучить, как работает перебазирование, чтобы я мог связать его с ngen и получить повышение производительности в масштабном проекте, над которым я работаю.
Я перепробовал много разных способов перебазирования Dlls и отслеживал результаты, используя vmmap, окно отладчика модуля visual studio и проводник процессов; пока ничего не получилось
Я установил параметр Build->Advanced->DLL Base Address на 0x41000000, 0x42000000 и 0x43000000 для Dll1.dll, Dll2.dll и Dll3.dll соответственно. Эти адреса были определенно сохранены в качестве предпочтительного базового адреса в каждом из Dlls, но для каждого запуска Dlls беспорядочно перекладывали свои изображения во множество различных мест в памяти.
Я пытался использовать это приложение. Журналы, которые он генерирует, показывают, что у Dlls действительно есть предпочтительный базовый адрес (как я выбрал), встроенный, однако во время выполнения результаты все еще ошибочны
Я пытался использовать Ngen. Это приводит к тому, что.ni-версии Dlls загружаются вместе с оригинальными Dlls, и у всех 6 из них есть ошибочные ячейки памяти, которые совсем не похожи на те, о которых я просил.
Я пытался вставить свои изображения в GAC. Было отрадно видеть, что были загружены только версии Dll GAC, однако их области памяти все еще были нестабильны.
Я пробовал то, что чувствует каждая комбинация вышеперечисленного. Нет успеха
Изучение во время выполнения с использованием VMMap показывает, что существует огромный разрыв доступной памяти в адресном пространстве между 0x10000000 и 0x50000000, поэтому не должно быть никаких коллизий и нет необходимости в перебазировании Dll. Dll также очень малы, и разрыв в 0x01000000, который я оставляю между ними, чрезвычайно велик, поэтому они не должны сталкиваться друг с другом.
Что мне не хватает?
Моим основным упоминанием в этом упражнении была эта статья, которая очень информативна, но была написана в 2006 году для.Net2: изменилось ли что-то фундаментальное между тогда и сейчас?
Я серьезно сомневаюсь, что это имеет большое значение, но вот код, который я использую на всякий случай:
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Dll1;
using Dll2;
using Dll3;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.Name = "Poodle";
Console.ReadLine();
//Thread.Sleep(10000);
Blah();
}
static void Blah()
{
Console.WriteLine(Class2.shrooms(5, 'h'));
Class3.teenAngst();
Class1.Wait();
}
}
}
Class1.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Dll1
{
public static class Class1
{
public static void Wait()
{
Console.ReadLine();
Console.Write(" ");
}
}
}
Class2.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Dll2
{
public static class Class2
{
public static string shrooms(int argc, char argv)
{
return "Ranchdaddyx ";
}
}
}
Class3.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Dll3
{
public static class Class3
{
public static void teenAngst()
{
Console.Write("Belonging ");
}
}
}
3 ответа
Оказывается, что ASLR (рандомизация расположения адресного пространства) является виновником моих заблуждений. Очевидно, вы можете отключить его, но вы жертвуете безопасностью / выполняете много работы для себя. Я считаю все приключение неудачным экспериментом.
Нет необходимости перебазировать JIT-скомпилированный код:
JIT-скомпилированный код не имеет проблемы перебазирования, так как адреса генерируются во время выполнения в зависимости от места размещения кода в памяти. Кроме того, MSIL редко страдает от пропадания базового адреса, поскольку ссылки MSIL основаны на токене, а не на адресе. Таким образом, когда используется JIT-компилятор, система устойчива к коллизиям базовых адресов.
Сборки.NET и перебазирование DLL
Если я хочу перебазировать свои DLL, как мне это сделать?
.Net .dll сильно отличается от своих неуправляемых эквивалентов. Я, честно говоря, не думаю, что перебазировка была актуальна.
Проверьте эту статью MSDN. Что, помимо всего прочего, побуждает вас НЕ перебазировать. И дает по крайней мере одну вескую причину НЕ (это может сделать недействительной подпись строго подписанного собрания). В статье также обсуждаются потенциальные преимущества NGEN (как и ваша ссылка):