MySQL: Online
Load: Low
Sandbox: Ready

在 CounterStrikeSharp 插件中使用 NuGet 包与数据库

许多实用的插件都要保存数据:封禁记录、统计、段位。为此你要在项目里添加 NuGet 包,而最重要的规则是:在等待数据库时不要阻塞游戏。本指南以 Dapper 和 MySqlConnector 为例,把这两点都讲清楚。

1

添加软件包

NuGet 包写在项目文件中。Dapper 让查询更简洁,MySqlConnector 负责与 MariaDB 和 MySQL 通信。我们的编译器会在构建时替你下载它们。

<ItemGroup>
  <PackageReference Include="CounterStrikeSharp.API" Version="1.0.*" />
  <PackageReference Include="Dapper" Version="2.*" />
  <PackageReference Include="MySqlConnector" Version="2.*" />
</ItemGroup>
2

编译时会发生什么

构建会生成你的插件 DLL,以及它旁边的、插件所需软件包的 DLL。CounterStrikeSharp 已经包含的文件会被单独放进另一个文件夹,这样你就不会重复复制。

3

该把什么复制到服务器

把插件文件夹(里面带有软件包的 DLL)复制到服务器的 plugins 文件夹中。不要复制 dependencies 文件夹,因为服务器本来就有这些文件,再多一份可能引起冲突。

YourPlugin-Release.zip
YourPlugin
YourPlugin.dll
Dapper.dll
MySqlConnector.dll
dependencies
Files already provided by CounterStrikeSharp
4

执行查询而不卡住游戏

游戏运行在唯一的主线程上。如果在那里等待数据库,整个服务器都会卡顿。请在 Task.Run 中执行查询,需要再次操作游戏时,用 Server.NextFrame 回到主线程。

using CounterStrikeSharp.API;
using Dapper;
using Microsoft.Extensions.Logging;
using MySqlConnector;

public void CountPlayers()
{
    Task.Run(async () =>
    {
        await using var connection = new MySqlConnection(Config.ConnectionString);        var count = await connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM players");
        Server.NextFrame(() =>        {
            Logger.LogInformation("Players in the database: {Count}", count);
        });
    });
}
5

把连接字符串放在配置里

不要把地址、用户名和密码写进代码。请像我们的配置指南那样,把连接字符串放在插件配置中,这样每位服主都可以使用自己的数据库。

6

不适合放进插件的包

有些软件包太大,或者根本不是为在游戏服务器内运行而设计的,比如 ASP.NET 之类的 Web 框架。请优先选择小型库,如果某个包加载失败,检查它是否需要缺失的本机文件。

不要使用权限超出插件需要的数据库账号。请创建一个只能操作自己数据表的用户。
7

上线前先测试

先在测试服务器上用测试数据库试用插件。检查数据表能否正常创建、连接失败时插件是否不会崩溃,以及数据库宕机时日志里是否有清晰的提示。

这篇教程对你有帮助吗?

页面生成耗时 0.012 秒
CounterStrikeSharp Web Compiler V1.0 - 制作工具 由 RomaniaBarlap 为社区打造。