3

C#でゲームサーバー用のrconメッセージツールをコーディングしています。しかし、私はエラーに遭遇しました:

「名前'm'は現在のコンテキストに存在しません」

今ではあなたはあなたのスクリーンNOOBで叫んでいます!はい、私は自分がそうだと認めます。私は実際のコーディング経験がほとんどありません。

私はMFCC++とOpenGLで遊んだことがあり、かなり尊敬されているcodmodderです。「スクリプトはc++に基づいて大まかにgscです」ので、すぐに学べることを願っています。基本的にはbのインスタンスにアクセスしようとしました。メインループの外にありますが、エラーが発生しました:

名前bは現在のコンテキストに存在しません

そこで、新しいインスタンスで新しい接続を開始する新しいメッセージ関数を作成しました。次に、別の関数でアクセスを試みましたstopmessages()が、それでもエラーが発生します。

newbの質問でごめんなさい。私はこれについて長くそして一生懸命グーグルしてきました、そして私はただ理解していません。

これが私のコードです-Nini.dll設定ファイルへBattleNET.dllのアクセスとゲームのrconへのアクセスに使用します-

#region

using System;
using System.Net;
using System.Text;
using BattleNET;
using Nini.Config;
#endregion



namespace BattleNET_client
{

internal class Program
{
    
   private static  void Main(string[] args)
    {
        bool isit_ok = true;
        
        Console.OutputEncoding = Encoding.UTF8;
        Console.Title = "rotceh_dnih's DayZ servermessages";
        BattlEyeLoginCredentials loginCredentials = GetLoginCredentials();
        Console.Title += string.Format(" - {0}:{1}", loginCredentials.Host, loginCredentials.Port);
        IBattleNET b = new BattlEyeClient(loginCredentials);
        b.MessageReceivedEvent += DumpMessage;
        b.DisconnectEvent += Disconnected;
        b.ReconnectOnPacketLoss(true);
        b.Connect();
        
        while (true)
        {
            startmessages();
            string cmd = Console.ReadLine();

            if (cmd == "exit" || cmd == "logout" || cmd == "quit")
            {
                Environment.Exit(0);
            }

            if (cmd == "restart")
            {
                stopmessages();
            }
            if (cmd == "startstuff")
            {
                startmessages();
            }

            if (b.IsConnected())
            {
                if (isit_ok)
                {
                    
                }
                isit_ok = false;
                b.SendCommandPacket(cmd);
            }
            else
            {
                Console.WriteLine("Not connected!");
            }
        }
    }

    private static BattlEyeLoginCredentials GetLoginCredentials()
    {
       
        IConfigSource source = new IniConfigSource("server/admindets.ini");
        string serverip = source.Configs["rconlogin"].Get("ip");
        int serverport = source.Configs["rconlogin"].GetInt("port");
        string password = source.Configs["rconlogin"].Get("rconpwd");
        var loginCredentials = new BattlEyeLoginCredentials
                                   {
                                       Host = serverip,
                                       Port = serverport,
                                       Password = password,
                                   };          
        return loginCredentials;
    }

   public static void startmessages()
    {
       BattlEyeLoginCredentials loginCredentials = GetLoginCredentials();
        IBattleNET m = new BattlEyeClient(loginCredentials);
        m.MessageReceivedEvent += DumpMessage;
        m.DisconnectEvent += Disconnected;
        m.ReconnectOnPacketLoss(true);
        m.Connect();

        IConfigSource messagesource = new IniConfigSource("messages/servermessages.ini");

        int messagewait = messagesource.Configs["timesettings"].GetInt("delay");
        string[] messages = messagesource.Configs["rconmessages"].Get("messages1").Split('|');
    //    for (;;)
      //  {
      
            foreach (string message in messages)
            {
                Console.WriteLine(message);
                 m.SendCommandPacket(EBattlEyeCommand.Say,message);
                 System.Threading.Thread.Sleep(messagewait * 60 * 1000); 
                
            }
     //   }
       
    }


   public static void stopmessages()
   {
       
       m.Disconnect();
   }


    private static void Disconnected(BattlEyeDisconnectEventArgs args)
    {
        Console.WriteLine(args.Message);
    }

    private static void DumpMessage(BattlEyeMessageEventArgs args)
    {
        Console.WriteLine(args.Message);
    }
}
}
4

6 に答える 6

4

mの宣言をクラススコープに入れる必要があります。

internal class Program
{

    // declare m as field at class level
    private static IBattleNET m;

    private static  void Main(string[] args)
    {
        ....
    }


    public static void startmessages()
    {
       BattlEyeLoginCredentials loginCredentials = GetLoginCredentials();


        // JUST SET THE VALUE HERE
        m = new BattlEyeClient(loginCredentials);
        m.MessageReceivedEvent += DumpMessage;
        m.DisconnectEvent += Disconnected;
        m.ReconnectOnPacketLoss(true);
        m.Connect();

        IConfigSource messagesource = new IniConfigSource("messages/servermessages.ini");

        int messagewait = messagesource.Configs["timesettings"].GetInt("delay");
        string[] messages = messagesource.Configs["rconmessages"].Get("messages1").Split('|');
    //    for (;;)
      //  {

            foreach (string message in messages)
            {
                Console.WriteLine(message);
                 m.SendCommandPacket(EBattlEyeCommand.Say,message);
                 System.Threading.Thread.Sleep(messagewait * 60 * 1000); 

            }
     //   }

    }
于 2012-11-02T08:29:42.293 に答える
1

変数mはstartmessages()メソッド内にのみ存在するため、stopmessages()メソッドはmにアクセスできません。

于 2012-11-02T08:30:40.917 に答える
0

の宣言を移動しますIBattleNET m

関数の外に出mainて静的にする:

static IBattleNet b;

その後、あなたmainはただしますm = new BattlEyeClient(loginCredentials);

于 2012-11-02T08:29:54.333 に答える
0

mは静的メソッドのスコープで宣言されてstartmessagesいますが、スコープ内にないで使用しようとしていstopmessagesます。変数をクラススコープに移動し、静的として定義する必要があります(メソッドは静的であるため)。

うまくいけば、クライアントアプリはシングルスレッドです。そうでない場合は、スレッドセーフの問題も考慮する必要があります。

于 2012-11-02T08:30:00.687 に答える
0

あなたができることはあなたがあなたのクラスを宣言した後であるので、静的なvoidmainがあなたのm値を宣言することを忘れないでください

internal class Program
{
    IBattleNET m;

次に、startMessagesメソッドに追加します

m = new BattlEyeClient(loginCredentials);

これにより、クラス内のすべてのメソッドでm値を使用できるようになります

于 2012-11-02T08:31:22.550 に答える
0

私はmがこれを参照する必要があると仮定しています:

IBattleNET m = new BattlEyeClient(loginCredentials);

メソッドでstartmessages()。あなたがする必要があるのは、メソッド本体の外でIBattleNETmを宣言することです。

static IBattleNET m;
public static void startmessages()
{
    //etc
于 2012-11-02T08:31:38.480 に答える