Всем привет!
Очень давно я хотел найти способ написания
dll для Game Maker на C#. Мне удалось найти два видео урока на эту тему:
Видео 1Видео 2Но я хочу описать данный метод в статье, т.к. видео на английском языке, и многим может быть не понятно.
Для данной статьи я использовал
Visual Studio 2015.
Запускаем
Visual Studio и создаём новый проект "Библиоткека классов". Назовём её "MyDll".

После создания проекта вы должны увидеть следующий код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyDll
{
public class Class1
{
}
}
Давайте создадим простенькую функцию на сложение чисел. Она должна быть
статичная и
публичная. Я назвал её "Add".
public static double Add(double a, double b)
{
return a + b;
}
Стоить отметить, что
Game Maker может получать и передавать только
double и
string аргументы. (т.е. числа с плавающей точкой или строки)
Чтобы заставить эту функцию работать в
Game Maker, нужно установить одно расширение. Для этого, нажмите ПКМ в правой части проекта по вкладке "Ссылки", а затем "Управление пакетами NuGet".

В открывшемся окне, выберите вкладку "Обзор", а затем впишите в строку поиска "Dllexport".
Установите его щёлкнув на маленький квадратик справа около версии расширения или на кнопку "Установить".

После установки пакета, откроется окно конфигурации. В нём мы лишь укажем пространство имён, которое будет использовать данный пакет.
Основываясь на видеоуроке, я использовал такое же как и там:
System.Runtime.InteropServices
Далее нажимаем "Configurate".

Теперь нужно использовать пакет в проекте. Для этого в верхней части кода допишем строчку:
using System.Runtime.InteropServices;
Перед нашей функцией нужно будет дописать тоже одну строчку:
[DllExport("Add", CallingConvention.Cdecl)]
Где первый аргументы это название нашей функции, которая будет экспортироваться, а второй аргумент это тип вызова. (По умолчанию он Cdecl)
Данную строчку кода
следует писать перед всеми функциями, которые следует экспортировать. (использовать в
Game Maker)
Весь код будет выглядеть так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace MyDll
{
public class Class1
{
[DllExport("Add", CallingConvention.Cdecl)]
public static double Add(double a, double b)
{
return a + b;
}
}
}
Далее следует создать новую конфигурацию проекта. Если я правильно понял из видео урока, то
Game Maker работает только с теми dll, которые собраны под x86 (разрядностью платформы?)
Для этого, щёлкните на "Any CPU" на панели инструментов, а затем "Диспетчер конфигураций".

В столбце "Платформа" вновь щёлкните на "Any CPU". В открывшемся окне в графе "Новая платформа" выберите "x86". Затем щёлкните ОК.

После этого, конфигурация должна автоматически установиться на "x86".
Осталось лишь собрать проект. Для этого щёлкните по "Сборка", а затем "Собрать решение".

Если в проекте нет ошибок, то проект успешно соберётся.
Далее подключим dll к проекту
Game Maker. Для данного урока я использовал
Game Maker Studio 2 (Но и в GMS 1.4 тоже всё работает).
Создадим новый проект и создадим новое расширение.
В открывшемся окне, щёлкните на квадратную кнопку в графе "Files", а затем "Add File".

Добавим нашу dll. По умолчанию, она храниться по этому пути:
C:\Users\UserName\Documents\Visual Studio 2015\Projects\MyDll\MyDll\bin\x86\Debug
После добавления файла, щёлкните по нему два раза ЛКМ. В открывшемся окне щёлкните на квадратную кнопку в графе "Functions", а затем "Add Function"

Откроется окно в котором нужно прописать вызов функции из нашей dll.
Name - название функции, которая будет использоваться в
Game MakerExternal Name - название функции внутри dll
Help - подсказка при наборе название функции в коде
ReturnType - что возвращает функция из dll, число или строку (double/string)
Arguments - Количество аргументов в данной функции.
Следует настроить её так:
ReturnType следует указать
double, т.к. у нас складывается 2 числа и возвращается результат.
Так же, нужно добавить 2 аргумента типа
double, чтобы передать 2 числа для сложения в dll.
Собственно, на этом и всё. Можете проверить данную функцию. Пропишем при нажатии клавиши Enter какого либо объекта небольшой код:
var sum = add(10, 18);
show_message(sum);
Должно высветиться сообщение с текстом 28.
Всем спасибо за внимание! Надеюсь у всех всё получится.
Если есть какие либо неточности в статье или ошибки, можете меня поправить.
Всем привет!
Очень давно я хотел найти способ создания
dll для
game maker на
C#. И Мне удалось найти интересную статью.
Ссылка на статьюДа, возможно нет смысла писать мне
мою статью, но на всякий случай, опишу вкратце (дабы избежать непредвиденных случаев с битыми ссылками или утеряй статьи)
Для данной статьи я использовал
visual studio 2010.
Открываем
visual studio и создаём новую проект библиотеки (dll). Я назвал её
TestCSharpDll.

В открытом окне, вы получите такой код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestCSharpDll
{
public class Class1
{
}
}
Далее, объявим простую функцию на сложение чисел (да, какая банальность). Я назвал эту функцию
TestFunction.
public static double TestFunction(double i, double j)
{
return i + j;
}
Следующим шагом нужно заставить всё это дело
работать в Game Maker.
Допишем строку перед функцией.
[System.Reflection.Obfuscation(Feature = "DllExport")]
Готовый код будет выглядеть так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestCSharpDll
{
public class Class1
{
[System.Reflection.Obfuscation(Feature = "DllExport")]
public static double TestFunction(double i, double j)
{
return i + j;
}
}
}
Данную строку
нужно писать перед объявлением каждой функции, иначе она не будет вызываться.
Далее, вам нужно загрузить программу
ExportDll (также, я её прикрепил к статья). Положите её в любое удобное место.
В файле
Params.set укажите корректные пути к
ilasm.exe и
ildasm.exe (по умолчанию, они уже должны быть на вашем компьютере). У меня файл выглядит так:
ilasmpath=C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe
ildasmpath=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe
Вернёмся к нашему проекту в
visual studio. Кликните:
проект -> свойства проекта. Найдите вкладку
"события построения". Найдите поле
"Командная строка события после построения" и впишите туда полный путь до программы
ExportDll с параметром
TargetPath. Это будет выглядеть примерно так:

По сути, всё готово. Кликните
Отладка -> Построить решение. После компиляции,
вы найдёте вашу dll в папке проектов Visual Studio. У меня она находится здесь:
C:\Users\Просто\Documents\Visual Studio 2010\Projects\TestCSharpDll\TestCSharpDll\bin\Release
Запускаем
Game Maker, создаём новый проект.
Создайте новый объект.
В
create 
пропишим нашу dll и вызов функции из неё:
num1 = 8
num2 = 11
global.NewFunction = external_define('TestCSharpDll.dll','TestFunction',dll_stdcall,ty_real,2,ty_real,ty_real)
total = external_call(global.NewFunction,num1,num2)
show_message(string(num1)+’+’+string(num2)+’=’+string(total))
Сохраните или скомпилируйте проект.
Не забудьте рядом положить вашу dll. Запустите и вуаля! Наша dll отлично складывает числа! (при условии того, что вы всё сделали правильно)
Надеюсь, это статья будет полезна. Всем спасибо за внимание.
