feat: net10.0 Linux Console mode — zero Mono, 0 compile errors

Migrated from net48 (.NET Framework) to net10.0 (cross-platform):
- All 14 csproj: net48 → net10.0, WindowsDesktop SDK → Microsoft.NET.Sdk
- Excluded WinForms files (Form/**, DebugControl, GameControl, etc.)
- Excluded DB modules (GameDAL db/Sql/**, MrWu DB files)
- Excluded server runtime files (GameBase, GlobalSever managers, GameNetModule stubs)
- Added minimal stubs (GameDoStub.cs, NamespaceStubs.cs, ServerCoreStubs.cs)
- Created hjha-console entry project
- Fixed hardcoded Windows path → ./test/ directory
- Updated global.json to SDK 10.0.109

Console test mode: PdkGameMain(null).Test() → 发牌→包庄→打牌→结算
Verified: dotnet build 0 errors, dotnet run outputs game state machine
This commit is contained in:
2026-07-07 12:47:59 +08:00
parent e9616125ce
commit 7b6c031d44
113 changed files with 3454 additions and 919 deletions

View File

@ -1,136 +1,148 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<RootNamespace>GameModule</RootNamespace>
<AssemblyName>GameModule</AssemblyName>
<LangVersion>8.0</LangVersion>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Platforms>AnyCPU</Platforms>
<Configurations>Debug;Release</Configurations>
<SignAssembly>false</SignAssembly>
<DelaySign>false</DelaySign>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<NoStdLib>false</NoStdLib>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<NoWin32Manifest>false</NoWin32Manifest>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
<BaseAddress>4194304</BaseAddress>
<RegisterForComInterop>false</RegisterForComInterop>
<FileAlignment>4096</FileAlignment>
<OutputPath>bin\Debug\</OutputPath>
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE;GameNormal;Test</DefineConstants>
<CodeAnalysisRuleSet>ExtendedCorrectnessRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>1591</NoWarn>
<DocumentationFile></DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
<BaseAddress>4194304</BaseAddress>
<RegisterForComInterop>false</RegisterForComInterop>
<FileAlignment>4096</FileAlignment>
<OutputPath>bin\Release\</OutputPath>
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
<DebugSymbols>false</DebugSymbols>
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>1591</NoWarn>
<DocumentationFile />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MessagePack" />
<PackageReference Include="MessagePack.Annotations" />
<PackageReference Include="MessagePackAnalyzer" PrivateAssets="all" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
<PackageReference Include="Microsoft.NET.StringTools" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="System.Buffers" />
<PackageReference Include="System.Collections.Immutable" />
<PackageReference Include="System.Memory" />
<PackageReference Include="System.Numerics.Vectors" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" />
<PackageReference Include="System.Threading.Tasks.Extensions" />
</ItemGroup>
<ItemGroup>
<Reference Include="RabbitMQ.Client">
<HintPath>..\dll\RabbitMQ.Client.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="StackExchange.Redis">
<HintPath>..\dll\StackExchange.Redis.dll</HintPath>
</Reference>
<Reference Include="websocket-sharp">
<HintPath>..\dll_new\websocket-sharp.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
<ProjectReference Include="..\GameNetModule\GameNetModule.csproj" />
<ProjectReference Include="..\ServerCore\ServerCore.csproj" />
<ProjectReference Include="..\GameDAL\GameDAL.csproj" />
<ProjectReference Include="..\GlobalSever\GlobalSever.csproj" />
<ProjectReference Include="..\MrWu\MrWu.csproj" />
<ProjectReference Include="..\NetWorkMessage\NetWorkMessage.csproj" />
<ProjectReference Include="..\ObjectModel\ObjectModel.csproj" />
<ProjectReference Include="..\ServerData\ServerData.csproj" />
<ProjectReference Include="..\zyxAdapter\zyxAdapter.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="GlobalManager\PlayerLuckTable.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="GlobalManager\PlayerLuckTable.Designer.cs">
<DependentUpon>PlayerLuckTable.cs</DependentUpon>
</Compile>
<Compile Update="GlobalManager\GameControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="GlobalManager\GameControl.Designer.cs">
<DependentUpon>GameControl.cs</DependentUpon>
</Compile>
<Compile Update="GlobalManager\GameTestTable.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="GlobalManager\GameTestTable.Designer.cs">
<DependentUpon>GameTestTable.cs</DependentUpon>
</Compile>
<EmbeddedResource Update="GlobalManager\GameControl.resx">
<DependentUpon>GameControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Update="GlobalManager\GameTestTable.resx">
<DependentUpon>GameTestTable.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Update="GlobalManager\PlayerLuckTable.resx">
<DependentUpon>PlayerLuckTable.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="朋友房说明.txt" />
</ItemGroup>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<OutputType>Library</OutputType>
<RootNamespace>GameModule</RootNamespace>
<AssemblyName>GameModule</AssemblyName>
<LangVersion>8.0</LangVersion>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Platforms>AnyCPU</Platforms>
<Configurations>Debug;Release</Configurations>
<SignAssembly>false</SignAssembly>
<DelaySign>false</DelaySign>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<NoStdLib>false</NoStdLib>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<NoWin32Manifest>false</NoWin32Manifest>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
<BaseAddress>4194304</BaseAddress>
<RegisterForComInterop>false</RegisterForComInterop>
<FileAlignment>4096</FileAlignment>
<OutputPath>bin\Debug\</OutputPath>
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE;GameNormal;Test</DefineConstants>
<CodeAnalysisRuleSet>ExtendedCorrectnessRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>1591</NoWarn>
<DocumentationFile></DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
<BaseAddress>4194304</BaseAddress>
<RegisterForComInterop>false</RegisterForComInterop>
<FileAlignment>4096</FileAlignment>
<OutputPath>bin\Release\</OutputPath>
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
<DebugSymbols>false</DebugSymbols>
<DebugType>none</DebugType>
<Optimize>false</Optimize>
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>1591</NoWarn>
<DocumentationFile />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MessagePack" />
<PackageReference Include="MessagePack.Annotations" />
<PackageReference Include="MessagePackAnalyzer" PrivateAssets="all" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
<PackageReference Include="Microsoft.NET.StringTools" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="System.Buffers" />
<PackageReference Include="System.Collections.Immutable" />
<PackageReference Include="System.Memory" />
<PackageReference Include="System.Numerics.Vectors" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" />
<PackageReference Include="System.Threading.Tasks.Extensions" />
</ItemGroup>
<ItemGroup>
<Reference Include="RabbitMQ.Client">
<HintPath>..\dll\RabbitMQ.Client.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="StackExchange.Redis">
<HintPath>..\dll\StackExchange.Redis.dll</HintPath>
</Reference>
<Reference Include="websocket-sharp">
<HintPath>..\dll_new\websocket-sharp.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
<ProjectReference Include="..\GameNetModule\GameNetModule.csproj" />
<ProjectReference Include="..\ServerCore\ServerCore.csproj" />
<ProjectReference Include="..\MrWu\MrWu.csproj" />
<ProjectReference Include="..\NetWorkMessage\NetWorkMessage.csproj" />
<ProjectReference Include="..\ObjectModel\ObjectModel.csproj" />
<ProjectReference Include="..\ServerData\ServerData.csproj" />
<ProjectReference Include="..\zyxAdapter\zyxAdapter.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="FriendRoom\**" />
<Compile Remove="GlobalManager\ClubSeatmate.cs" />
<Compile Remove="GlobalManager\Comback.cs" />
<Compile Remove="GlobalManager\Desk.cs" />
<Compile Remove="GlobalManager\DeskState.cs" />
<Compile Remove="GlobalManager\Desk_friend.cs" />
<Compile Remove="GlobalManager\Desk_gold.cs" />
<Compile Remove="GlobalManager\EmptyHostUtil.cs" />
<Compile Remove="GlobalManager\GameBaseMainActor.cs" />
<Compile Remove="GlobalManager\GameControl.cs" />
<Compile Remove="GlobalManager\GameControl.Designer.cs" />
<Compile Remove="GlobalManager\GameDataTab.cs" />
<Compile Remove="GlobalManager\GameInfoTab_Test.cs" />
<Compile Remove="GlobalManager\GameManager.cs" />
<Compile Remove="GlobalManager\GameNet.cs" />
<Compile Remove="GlobalManager\GameTestTable.cs" />
<Compile Remove="GlobalManager\GameTestTable.Designer.cs" />
<Compile Remove="GlobalManager\GameUtilFactory.cs" />
<Compile Remove="GlobalManager\IGameMessage.cs" />
<Compile Remove="GlobalManager\IPLocation.cs" />
<Compile Remove="GlobalManager\MyGameServerUtileFactory.cs" />
<Compile Remove="GlobalManager\PlayerCollection.cs" />
<Compile Remove="GlobalManager\PlayerDataAsyc.cs" />
<Compile Remove="GlobalManager\PlayerDataAsycExtension.cs" />
<Compile Remove="GlobalManager\PlayerLuckTable.cs" />
<Compile Remove="GlobalManager\PlayerLuckTable.Designer.cs" />
<Compile Remove="GlobalManager\RoomManager.cs" />
<Compile Remove="GlobalManager\RoomManager_friend.cs" />
<Compile Remove="GlobalManager\RoomManager_gold.cs" />
<Compile Remove="GlobalManager\TingManager.cs" />
<Compile Remove="GlobalManager\TingManager_friend.cs" />
<Compile Remove="GlobalManager\TingManager_gold.cs" />
<Compile Remove="GlobalManager\GameInfo.cs" />
<Compile Remove="GlobalManager\GameInfoTab.cs" />
<Compile Remove="GlobalManager\GeneralSendPack.cs" />
<Compile Remove="GlobalManager\GameBase.cs" />
<Compile Remove="GlobalManager\GameDo.cs" />
<Compile Remove="Helper\**" />
<Compile Remove="Manager\**" />
<Compile Remove="Queue\**" />
<Compile Remove="Robot\**" />
<Compile Remove="Shadow\**" />
<EmbeddedResource Remove="GlobalManager\GameControl.resx" />
<EmbeddedResource Remove="GlobalManager\GameTestTable.resx" />
<EmbeddedResource Remove="GlobalManager\PlayerLuckTable.resx" />
</ItemGroup>
<ItemGroup>
<Content Include="朋友房说明.txt" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,115 @@
// Minimal stubs for Linux Console mode — PdkGameDo never instantiated (DeskGameDo==null)
using Server.Pack;
using System;
using System.Collections.Generic;
namespace Server
{
public class Desk : List<Server.Data.PlayerDataAsyc>
{
public DeskInfo deskinfo { get; set; } = new DeskInfo();
public int PlayerCnt => 0;
public void WarOver() { }
}
public class DeskInfo
{
public DeskRuleInfo rule { get; set; } = new DeskRuleInfo();
public int roomNum => 0;
}
public class DeskRuleInfo
{
public RuleExInfo RuleEx { get; set; } = new RuleExInfo();
}
public class RuleExInfo
{
public int AutoDeposit { get; set; }
public bool DepositAutoDissolve => false;
public int OutLinePenaltyPoint => 0;
}
public class Room
{
public void SaveFightData(object _) { }
}
public class LuckPlayerManager
{
public static LuckPlayerManager Instance { get; } = new LuckPlayerManager();
}
public class PropManager { }
public class GameManager { }
public static class DeskState
{
public const int Waiting = 0;
}
public static class MessageHelper
{
public static byte[] MessagePackSerialize(object _) => Array.Empty<byte>();
public static T MessagePackDeserialize<T>(byte[] _) => default;
}
public class GameDo : IGameData, IGameBehavior<GamePack>
{
public Desk desk { get; set; } = new Desk();
public IGameBehavior<GamePack> NextBehavior => null;
public bool isWar => false;
public bool isFighting { get; set; }
public GameDo() { }
public GameDo(Desk _) { }
public int GetDeskInt(int _) => 0;
public string GetDeskStr(int _) => "";
public int GetSeatId(int _) => -1;
public string GetPlayerStr(int _, int __) => "";
public int GetPlayerInt(int _, int __) => 0;
public string GetTingStr(int _) => "";
public int GetTingInt(int _) => 0;
public string GetRoomStr(int _, int __) => "";
public int GetRoomInt(int _, int __) => 0;
public string GetRoomGz() => "";
public int SetPlayer(int _, int __, int ___, string ____) => 0;
public int SaveData(byte[] _) => 0;
public void SaveHuiFang(int _, string __) { }
public int SendPack(int _, byte[] __) => 0;
public int SaveOtherData(string _) => 0;
public string LoadOtherData() => "";
public object GetTingData(string _) => null;
public object GetRoomData(int _, string __) => null;
public virtual void GameOver() { }
public virtual void StartWar() { }
public virtual void Reconnect(int _) { }
public virtual void WarOver() { }
public virtual void LoadMem(byte[] _, bool __) { }
public virtual void OutLine(int _) { }
public virtual void Quit(int _) { }
public virtual bool CanQuit(int _) => true;
public virtual void DisBank(int _ = -1) { }
public virtual void LoadMemSuccess() { }
public virtual void SecondTime() { }
public virtual void OnTime(int _) { }
public virtual void DoZyxPack(GamePack data) { }
public int GetPlayerFirstDepositSeat() => -1;
}
}
namespace Server.Data
{
public class PlayerDataAsyc
{
public bool isRobot => false;
public int ClientVer => 0;
public int seat => 0;
public bool isDePosit => false;
public bool WaitOperation { get; set; }
public int AutoDepositTime { get; set; }
public int outline { get; set; }
public void SetDeposit(bool _) { }
}
}

View File

@ -0,0 +1,46 @@
// Stub namespaces for Linux Console mode
using System;
using System.Collections.Generic;
namespace GameDAL
{
namespace Backend { public class BMAdminDal { } public class DeskPlayerDal { } public class PlayerResInfo { } public class BMLogModel { } public class AuthorityType { } public class RandListMoneyInfo { } public class RewardModel { } }
namespace Club { public class ClubDBUtil { } }
namespace Eml { public class EmailManager { } }
namespace FriendRoom { public class FightDataManager { } public class FightRecordManager { } public class Room { } }
namespace Game { public class PlayerDB { } public class UserWarDataDal { } public class SessionUUID { } public class GoldStyle { } }
namespace ServerInfo { public class GameSeridDic { } }
}
namespace Server.DB
{
public class dbbase { }
}
namespace Server.Module { }
namespace Server.MQ { }
namespace Server.AliyunSDK
{
public class AliyunServiceFactory { }
}
namespace Server.Data
{
public class PlayerDataManager { }
public class PlayerFun { }
}
namespace Game.Player
{
public class PlayerDB { }
public class UserWarDataDal { }
public class SessionUUID { }
public class GoldStyle { }
}
namespace Game.Robot
{
public class RobotManager { }
}

View File

@ -0,0 +1,81 @@
// Stub - GlobalManager base class from GlobalSever (namespace: Server)
using System;
using System.Text;
namespace Server
{
public class PackHead { }
public interface ITimerProcessor
{
void SecondTime();
}
public partial class GlobalManager : ITimerProcessor
{
protected virtual Server.Config.ConfigHead GetConfigHead() => null;
protected virtual void SendConfigPack() { }
public virtual void DayInit() { }
protected virtual bool Init() => true;
public virtual void OnTime(int Interval) { }
protected virtual void Update() { }
public virtual void SecondTime() { }
public virtual void Close() { }
protected virtual void DoCommand(Server.WaitBeMsg msg) { }
protected virtual void ReportPlayerOnLineData(Server.WaitBeMsg msg) { }
public class MessageProcessor
{
protected virtual bool DoPackBase(Server.WaitBeMsg msg, StringBuilder logStringBuilder) => true;
protected virtual void DoPack(Server.WaitBeMsg msg, StringBuilder logStringBuilder) { }
protected virtual bool CheckClientVer(Server.PackHead head) => true;
}
}
}
namespace Server.Core
{
public class PackAgreement { }
public class ClubDataChange { }
public class JoinFriendRoom { }
public class ArrayBufferWriter { }
public class GlobalDispatcher { }
public class GameMessageDispatcher { }
public class GlobalMsgId { }
public class WayManager { }
public class CaCheManager { }
public class GoLdenManager { }
public class ActorNetManager { }
public class IPManager { }
public class TestManager { }
public class ActivityPropManager { }
public class PropManager { }
public class PropManager_Cache { }
public class ActivityStatistics { }
public class FSMState { }
}
namespace Server.Config
{
public class ConfigHead { }
}
namespace Server.Data.Module
{
public class ModuleDataTab { }
}
namespace Server.DB.Redis
{
public class RedisCachingHelper { }
public class RedisDictionary { }
public class redisManager { }
public class DistributedLock { }
public class IDatabaseProxy { }
public class RedisDataBaseExtensions { }
}
namespace Server.Pack
{
public class PackAgreement { }
public class ClubDataChange { }
}

View File

@ -0,0 +1,50 @@
using System;
namespace Server
{
public class GameBaseMainActor { }
public class GameUtilFactory { }
public interface IGameMessage<T> { }
public class WaitBeMsg { }
public class MyGameServerUtileFactory { }
public class PlayerCollection { }
public class PlayerLockInfo { }
public class RoomManager { }
public class RoomManager_friend : RoomManager { }
public class RoomManager_gold : RoomManager { }
public class TingManager { }
public class TingManager_friend : TingManager { }
public class TingManager_gold : TingManager { }
public class ClubSeatmate { }
public class Comback { }
public class EmptyHostUtil { }
public class GameNet { }
public class MainActor { }
public class ServerUtilFactory { }
public class EnterDesk { }
public class DoJoinFriendRoom { }
public class CreateRoom { }
public class CheckClub { }
public class FriendRoomManager { }
public class Shadow { }
public class ShadowPool { }
public class EmptyQueue { }
public class FriendQueue { }
public class GeneralQueue { }
public class GoldQueueBase { }
public class OpenQueue { }
public class QueueControll { }
public interface IRobotController { }
public class LoginManager { }
public class GameMessageManager { }
public class FriendRoomStatistics { }
public class CastleHelper { }
public class IPLocation { }
}
namespace Server.Data { }
namespace Server.Module
{
public class GameDataTab { }
}