Листая FAQ на официальном форуме, я случайно наткнулся на раздел, описывающий компиляцию ядра и скриптов в пределах одной сборки. Объединяя ядро и скрипты, на выходе мы получаем исполняющий .exe файл сервера и .dll библиотеку, в которой содержатся все файлы папки Scripts. Такой метод сулит нам:
- Увеличение скорости компиляции (кто просветит за счет чего? (IMG:style_emoticons/default/smile.gif) );
- Простота развертывания (не надо закачивать на хостинг тысячу файлов, достаточно закачать одну библиотеку). Здесь однако кроется и минус - для замены одного маленького файла придется менять всю библиотеку - это около 4МБ, сомнительный плюс при сопровождении сервера;
- Все компилируется заранее на вашей машине, на хостинге при запуске сервер мгновенно начинает работу;
- Все файлы уложены в одну сборку и вы всегда можете быть уверены, что на хостинге размещена их полная копия (там их просто никто не сможет отредактировать);
- Даже украв с хостинга библиотеку, злоумышленник не получит доступ к исходному коду скриптов. Впрочем их можно декомпилировать, но это создаст дополнительную головную боль;
Несмотря на обилие шагов, каждый из них по отдельности прост и реализуется одним-двумя кликами. Поэтому процедура в целом достаточно проста и, на мой взгляд, заслуживает хотя бы усилия по ее выполнению (IMG:
style_emoticons/default/biggrin.gif) Дополнительную информацию по отдельным пунктам можно получить
здесь.Итак, для реализации задуманного нам понадобятся
исходные коды RunUO (*_Full_Src.rar) и
C# Exress (выбрать пункт Visual Studio 2012 Express для Windows Desktop) для сборки. Исходные коды самой последней версии могут быть также получены через
SVN, описание как это сделать можно найти
здесь. Когда все под рукой, то мы можем начинать.
1) В C# Express создаем новую сборку через
File --> New --> Project... --> Visual C# --> Console Application. Название может быть любым, здесь я назову его
RunUO;2) В открывшемся Solution Explorer, показывающим что входит в нашу сборку, удаляем из проекта файлы
AssemblyInfo.cs и
Program.cs, если таковые были созданы;
3) В Windows открываем папку, содержащую исходные коды, и перетаскиваем папку
Server на название проекта в Solution Explorer -
RunUO. Наши файлы будут добавлены в проект;
4) Открываем меню
Project (рядом с File, Edit, View) и выбираем в самом низу функцию
"RunUO Properties";5) На вкладке
Application устанавливаем Startup object:
Server.Core.6) На следующей вкладке
Build ставим галочку напротив
Allow unsafe code;7) Сохраняем проект
(File --> Save all), указав произвольное местоположение сборки;
8) В Solution Explorer нажимаем правой кнопкой на название сборки
(RunUO), выбираем
Add... --> New Project... --> Class Library. Название также может быть любым, я назвал его
Scripts. Это и будет нашей библиотекой скриптов;
9) Теперь в нашей сборке
RunUO содержится два проекта -
RunUO и
Scripts. Также удаляем из проекта файлы
AssemblyInfo.cs и
Program.cs, если таковые были созданы;
10) Нажимаем правой кнопкой на название проекта
Scripts и выбираем
Add Reference... Добавляем из вкладки .NET библиотеки:
- System.Web;
- System.Drawing;
- System.Windows.Forms;
- System.Runtime.Remoting.
11) Из папки с исходными кодами перетаскиваем папку
Scripts на название проекта в Solution Explorer -
Scripts. Файлы будут добавлены в проект;
12) Открываем меню
Project (рядом с File, Edit, View) и выбираем в самом низу функцию
"Scripts Properties";13) На вкладке
Build ставим галочку напротив
Allow unsafe code;14) Теперь в проекте
RunUO, в папке
Server находим файл
ScriptCompiler.cs и открываем его двойным щелчком;
15) Около ~541 строки находим следующий код:
Код
EnsureDirectory( "Scripts/" );
EnsureDirectory( "Scripts/Output/" );
if( m_AdditionalReferences.Count > 0 )
m_AdditionalReferences.Clear();
List<Assembly> assemblies = new List<Assembly>();
Assembly assembly;
выделяем его и заменяем на:
Код
bool HaveCoreScriptsDll = true;
EnsureDirectory( "Scripts/" );
EnsureDirectory( "Scripts/Output/" );
if( m_AdditionalReferences.Count > 0 )
m_AdditionalReferences.Clear();
List<Assembly> assemblies = new List<Assembly>();
Assembly assembly = null;
try
{
assembly = Assembly.LoadFrom("Scripts.dll");
}
catch (Exception e)
{
Console.WriteLine(String.Format("Scripts.DLL: {0}", e.Message));
Console.WriteLine("Can't load script library, Scripts.DLL! Proceeding without it.");
HaveCoreScriptsDll = false;
}
if (HaveCoreScriptsDll)
{
if ( !m_AdditionalReferences.Contains( assembly.Location ) )
m_AdditionalReferences.Add( assembly.Location );
assemblies.Add(assembly);
Version CSversion = assembly.GetName().Version;
Console.WriteLine("Using: [{0}] Version {1}.{2}.{3}.{4}", assembly.GetName().Name, CSversion.Major, CSversion.Minor, CSversion.Build, CSversion.Revision);
}
16) Сохраняем проект
(File --> Save all);17) Нажимаем правой кнопкой на название проекта
RunUO, выбираем
Build. Если все было сделано верно, то в папке сборки
\bin\Release появится RunUO.exe - собранное ядро. Если ошибки, то еще раз внимательнее собираем проект и анализируем что было сделано не так;
18) Когда ядро собрано, то нажимаем правой кнопкой на названии проекта
Scripts и добавляем ссылку через
Add Reference... найдя через вкладку Browse файл ядра -
RunUO.exe;19) Нажимаем правой кнопкой на название сборки
RunUO и выбираем
Project Dependencies... где для проекта
Scripts добавляем галочкой зависимость от
RunUO;20) Сборка почти закончена. В файле
Scripts\Misc\ServerList.cs прописываем название нашего шарда и его адрес; в
Scripts\Misc\DataPath.cs расположение .mul файлов;
21) Сохраняем проект
(File --> Save all);22) Собираем целиком сборку
Build --> Build Solution;23) В папке сборки
Scripts\bin\Release получаем окончательный вариант - ядро
RunUO.exe и библиотеку скриптов
Scripts.dll;24) В итоге ваш сервер будет иметь следующую структуру
- Data (папка взята из исходных кодов)
- RunUO.exe (ядро)
- Scripts.dll (библиотека скриптов)
- zlib32.dll (для x32 битной ОС)
- zlib64.dll (для x64 битной ОС)
Запускаем, радуемся (IMG:
style_emoticons/default/smile.gif)
Оригинальная статья написана
Jareish, ее можно прочитать
здесь.