Write your first C# resource
Server-side C# uses RAGE:MP's GTANetworkAPI (NAPI.*, Script, [Command], [ServerEvent],
[RemoteEvent]). Your resource is a .NET class library that references the server's
Bootstrapper.dll.
You need the .NET 8 SDK to build. The server itself brings its own .NET 8 runtime.
1. Create the resource folder
server/dotnet/resources/MyFirstResource/
├─ meta.xml
├─ MyFirstResource.csproj
└─ Main.cs
meta.xml
<meta>
<info name="MyFirstResource" type="script"/>
<script src="bin/Release/net8.0/MyFirstResource.dll"/>
</meta>
MyFirstResource.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Reference Include="Bootstrapper">
<HintPath>..\..\runtime\Bootstrapper.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
</Project>
Private=false keeps Bootstrapper.dll out of your build folder; the server provides it.
A gamemode built for RAGE:MP against netcoreapp3.1 also loads as-is.
2. Write the script
using GTANetworkAPI;
namespace MyFirstResource
{
public class Main : Script
{
[ServerEvent(Event.ResourceStart)]
public void OnResourceStart()
{
NAPI.Util.ConsoleOutput("[MyFirstResource] started");
}
[ServerEvent(Event.PlayerConnected)]
public void OnPlayerConnected(Player player)
{
NAPI.Chat.SendChatMessageToAll($"~g~{player.Name} joined the server.");
}
[Command("heal")]
public void CmdHeal(Player player)
{
player.Health = 100;
player.Armor = 100;
player.SendChatMessage("~g~Healed.");
}
[RemoteEvent("myEvent")]
public void OnMyEvent(Player player, string text, int number)
{
NAPI.Util.ConsoleOutput($"{player.Name} sent {text} {number}");
}
}
}
[RemoteEvent] parameters are converted to their declared types (bool, int, uint, float,
string, …), as on RAGE:MP. The client calls it with mp.events.callRemote('myEvent', 'hi', 5).
3. Build and run
cd server\dotnet\resources\MyFirstResource
dotnet build -c Release
Make sure conf.json has "csharp": "enabled", then start the server. Every folder in
dotnet/resources/ with a meta.xml is loaded automatically.
Full reference: the Server C# tab.