Repository navigation
RU CSharp Structure
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
C#-программа состоит из объявлений типов, методов, выражений и операторов. using подключает пространство имён; namespace организует типы; класс хранит данные и поведение. Код метода располагается внутри { }, обычные операторы заканчиваются ;.
Сохраните этот пример отдельно как Example.csx. Запускайте его независимо от остальных примеров страницы.
Example.csx:
UO.Print("Ready");
await WaitAsync(10);
UO.Print("Done");Результат:
Ready
Done
Сохраните этот пример отдельно как Program.cs. Запускайте его независимо от остальных примеров страницы.
Program.cs:
// PROJECT-EXAMPLE
System.Console.WriteLine("Ready");Minimal.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup><Compile Include="Program.cs" /></ItemGroup>
</Project>dotnet run --project Minimal.csprojРезультат (Minimal.csproj):
Ready
Встроенный сценарий получает UO, Args, Cancellation и WaitAsync. Операторы выполняются сверху вниз. Класс Program не нужен.
string message = "Script started";
UO.Print(message);
await WaitAsync(100);
UO.Print($"X={UO.GetX()}, Y={UO.GetY()}");Объявление функции само её не запускает. Вызов ReportPosition() выполняет её тело.
void ReportPosition()
{
int x = UO.GetX();
int y = UO.GetY();
UO.Print($"Position: {x}, {y}");
}
ReportPosition();
await WaitAsync(100);
ReportPosition();В обычном проекте точкой входа служит Main или верхнеуровневый код. Пространства имён, несколько файлов и собственные библиотеки оформляются как стандартный C#-проект.
// PROJECT-EXAMPLE
using System;
namespace UserTools;
internal static class Program
{
private static int Main(string[] args)
{
Console.WriteLine(args.Length > 0 ? args[0] : "Ready");
return 0;
}
}.csproj описывает целевую платформу, исходники, зависимости и параметры компиляции. .cs хранит код. .csx обозначает сценарий для скриптового запуска. Изменение расширения не меняет автоматически структуру или точку входа программы.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>Типичная структура: MyScript.csproj, Program.cs, Models/, Services/. В небольшом сценарии достаточно одного .csx. В классе игровой API передаётся явно через параметр или поле; произвольный обычный проект не получает глобальный UO сам по себе.
Официальная документация: Структура программы и скрипта — Microsoft Learn.
В обычном .cs или .csproj точка входа Main или код верхнего уровня имеет приоритет, даже если сборка также содержит ICSharpScript. Если исполняемой точки входа нет, нужен один открытый, не абстрактный класс ICSharpScript с открытым конструктором без параметров. Игровой API в обычном коде доступен через переданный контекст или CSharpScriptContext.Current, а не через необъявленную глобальную переменную UO.
ClassicUO — Bad Newbie & C# Scripts IDE