Попытки перебазирования Dll в.net4 не работают

Я экспериментирую с перекомпоновкой Dll на небольшом тестовом решении, работающем на.net4, состоящем из одного маленького.exe и трех маленьких.Dll. Ссылки на сборки были установлены правильно, и программа компилируется и работает очень хорошо.

Цель этого упражнения - изучить, как работает перебазирование, чтобы я мог связать его с ngen и получить повышение производительности в масштабном проекте, над которым я работаю.

Я перепробовал много разных способов перебазирования Dlls и отслеживал результаты, используя vmmap, окно отладчика модуля visual studio и проводник процессов; пока ничего не получилось

  1. Я установил параметр Build->Advanced->DLL Base Address на 0x41000000, 0x42000000 и 0x43000000 для Dll1.dll, Dll2.dll и Dll3.dll соответственно. Эти адреса были определенно сохранены в качестве предпочтительного базового адреса в каждом из Dlls, но для каждого запуска Dlls беспорядочно перекладывали свои изображения во множество различных мест в памяти.

  2. Я пытался использовать это приложение. Журналы, которые он генерирует, показывают, что у Dlls действительно есть предпочтительный базовый адрес (как я выбрал), встроенный, однако во время выполнения результаты все еще ошибочны

  3. Я пытался использовать Ngen. Это приводит к тому, что.ni-версии Dlls загружаются вместе с оригинальными Dlls, и у всех 6 из них есть ошибочные ячейки памяти, которые совсем не похожи на те, о которых я просил.

  4. Я пытался вставить свои изображения в GAC. Было отрадно видеть, что были загружены только версии Dll GAC, однако их области памяти все еще были нестабильны.

  5. Я пробовал то, что чувствует каждая комбинация вышеперечисленного. Нет успеха

Изучение во время выполнения с использованием 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, как мне это сделать?

http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

http://support.microsoft.com/kb/969305

.Net .dll сильно отличается от своих неуправляемых эквивалентов. Я, честно говоря, не думаю, что перебазировка была актуальна.

Проверьте эту статью MSDN. Что, помимо всего прочего, побуждает вас НЕ перебазировать. И дает по крайней мере одну вескую причину НЕ (это может сделать недействительной подпись строго подписанного собрания). В статье также обсуждаются потенциальные преимущества NGEN (как и ваша ссылка):

CLR наизнанку

Другие вопросы по тегам