Здравствуйте, гость ( Вход | Регистрация )

> Ядро И Scripts В Единой Сборке
Soteric
сообщение 20.2.2009, 22:46
Сообщение #1


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 3057
Пользователь №: 7.166



Листая 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, ее можно прочитать здесь.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Juzzver
сообщение 11.12.2016, 1:22
Сообщение #2


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22567
Из: Северная Корея
Пользователь №: 11.273



папку Data просто в корень кидать надо, где сам RunUO.exe файл.
Папердол открывается на стороне клиента, если не ошибаюсь, возможно серверные настройки тут не причем.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Soteric   Ядро И Scripts В Единой Сборке   20.2.2009, 22:46
Warstone   Увеличение скорости компиляции (кто просветит за с...   21.2.2009, 0:10
Dark_Falcon   Угу. А если еще поставить Reflector.FileDisassemb...   21.2.2009, 1:26
Soteric   Обфускаторы тоже не спасают? :)   21.2.2009, 6:46
Dark_Falcon   Обфускаторы конечно могут сильно запутать код... ...   21.2.2009, 15:16
Soteric   Как бы то ни было, на мой взгляд, это тема отдельн...   21.2.2009, 16:48
Warstone   Вот тут в корне не согласен, этот метод не дает со...   22.2.2009, 5:50
Juzzver   Опоздал я с прочтением этой темы, но всё же скажу ...   7.11.2009, 4:51
Warstone   Я не варХамер =)))) Юзверь... Ты опять не понял са...   7.11.2009, 11:09
Juzzver   Извеняюсь, записался малёх =) Да суть всю я понял...   8.11.2009, 5:03
Sfairat   Можно тупой вопрос, то что собрать все в один файл...   11.8.2011, 9:36
Juzzver   это и подразумевается. Ты можешь одновременно обра...   11.8.2011, 10:33
Soteric   Не думаю. Проще написать .bat файл, который будет...   11.8.2011, 10:41
StaticZ   Не думаю. Проще написать .bat файл, который будет...   12.9.2011, 12:11
Realteque   Такой вопрос, всё скомпилировал, всё запустил, выс...   10.12.2016, 16:08


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 27.4.2024, 15:38
Designed by Nickostyle