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