Попытки перебазирования Dll в .net4 не работают - PullRequest
2 голосов
/ 12 сентября 2011

Я экспериментирую с перекомпоновкой 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 версии Dll загружаются вместе с оригинальными 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 ]

4 голосов
/ 12 сентября 2011

Нет необходимости перебазировать скомпилированный код JIT:

JIT-скомпилированный код не имеет проблемы с перебазированием, так как адреса генерируются во время выполнения в зависимости от того, где код находится в памяти. Кроме того, MSIL редко страдает от пропадания базового адреса, так как MSIL ссылки основаны на токене, а не на адресе. Таким образом, когда JIT-компилятор используется, система устойчива к базовому адресу столкновения.

.NET сборок и перебазирование DLL

Если я хочу перебазировать свои DLL, как мне это сделать?

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

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

2 голосов
/ 08 декабря 2011

Оказывается, что ASLR (рандомизация расположения адресного пространства) является виновником моих заблуждений. Очевидно, вы можете отключить его, но вы жертвуете безопасностью / выполняете много работы для себя. Я считаю все приключение неудачным экспериментом.

1 голос
/ 12 сентября 2011

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

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

CLR Inside Out

...