C#无法编译“CS0103:当前上下文中不存在名称'Gutils'”

时间:2017-09-20 10:50:50

标签: php

当我尝试使用csc.exe通过命令提示符编译此类时,每次都出现错误“'当前上下文中不存在'Gutils'”。怎么了?怎么会解决这个问题呢?我正在使用.Net Framework 3.5。

此类应编码/解码PlayerID,UserID,ProductID和Timestamp:

namespace GameSpy.Util
{
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Security.Cryptography;

    public class LoginTicket
    {
        private static byte[] LOGIN_TICKET_KEY = new byte[] { 0x8b, 0xad, 0x91, 0xac, 0xeb, 3, 0x71, 0xb9, 150, 0x53, 0xa8, 0x33, 0xe4, 0xf5, 0x2c, 0x2c };

        private static ushort Crc16(byte[] input)
        {
            int num = 0;
            foreach (byte num2 in input)
            {
                num = ((byte) (num >> 8)) | (num << 8);
                num ^= num2;
                num ^= ((byte) (num & 255)) >> 4;
                num ^= (num << 8) << 4;
                num ^= ((num & 255) << 4) << 1;
            }
            return (ushort) num;
        }

        public static string CreateLoginTicket(int userID, int profileID, ushort productID)
        {
            RijndaelManaged managed = new RijndaelManaged();
            managed.IV = new byte[16];
            managed.KeySize = 128;
            managed.Key = LOGIN_TICKET_KEY;
            managed.Mode = CipherMode.CBC;
            managed.Padding = PaddingMode.None;
            MemoryStream stream = new MemoryStream(16);
            CryptoStream stream2 = new CryptoStream(stream, managed.CreateEncryptor(), CryptoStreamMode.Write);
            MemoryStream output = new MemoryStream(16);
            BinaryWriter writer = new BinaryWriter(output);
            writer.Write(Gutils.UTCSeconds());
            writer.Write(userID);
            writer.Write(profileID);
            writer.Write(productID);
            writer.Write(Crc16(output.ToArray()));
            stream2.Write(output.ToArray(), 0, (int) output.Length);
            stream2.FlushFinalBlock();
            return B64Helper.StandardBase64ToSafeBase64(B64Helper.EncodeToString(stream.ToArray()));
        }

        public static void DecodeLoginTicket(string ticket, out int userID, out int profileID, out ushort productID, out DateTime timeStamp)
        {
            byte[] buffer = B64Helper.DecodeFromString(B64Helper.SafeBase64ToStandardBase64(ticket));
            RijndaelManaged managed = new RijndaelManaged();
            managed.IV = new byte[16];
            managed.KeySize = 128;
            managed.Key = LOGIN_TICKET_KEY;
            managed.Mode = CipherMode.CBC;
            managed.Padding = PaddingMode.None;
            MemoryStream stream = new MemoryStream(buffer.Length);
            CryptoStream stream2 = new CryptoStream(stream, managed.CreateDecryptor(), CryptoStreamMode.Write);
            stream2.Write(buffer, 0, buffer.Length);
            stream2.FlushFinalBlock();
            stream.Seek(0L, SeekOrigin.Begin);
            BinaryReader reader = new BinaryReader(stream);
            int seconds = reader.ReadInt32();
            userID = reader.ReadInt32();
            profileID = reader.ReadInt32();
            productID = reader.ReadUInt16();
            ushort num2 = reader.ReadUInt16();
            stream.SetLength(14L);
            ushort num3 = Crc16(stream.ToArray());
            if (num2 != num3)
            {
                throw new CryptographicException("Invalid CRC value");
            }
            timeStamp = Gutils.UTCSecondsToDateTime(seconds);
        }
    }
}

这是另一段代码:

namespace GameSpy.Util
{
    using System;
    using System.Security.Cryptography;
    using System.Text;

    public class B64Helper
    {
        public static byte[] Decode(byte[] inputBuffer)
        {
            return Decode(inputBuffer, 0, inputBuffer.Length);
        }

        public static byte[] Decode(byte[] inputBuffer, int inputOffset, int inputCount)
        {
            FromBase64Transform transform = new FromBase64Transform();
            return transform.TransformFinalBlock(inputBuffer, inputOffset, inputCount);
        }

        public static byte[] DecodeFromString(string input)
        {
            return Decode(Encoding.ASCII.GetBytes(input));
        }

        public static byte[] Encode(byte[] inputBuffer)
        {
            return Encode(inputBuffer, 0, inputBuffer.Length);
        }

        public static byte[] Encode(byte[] inputBuffer, int inputOffset, int inputCount)
        {
            ToBase64Transform transform = new ToBase64Transform();
            int num = (inputCount / 3) * 4;
            if ((inputCount % 3) != 0)
            {
                num += 4;
            }
            byte[] outputBuffer = new byte[num];
            int num2 = 0;
            for (int i = 0; num2 < inputCount; i += 4)
            {
                int num5 = Math.Min(3, inputCount - num2);
                if (num5 == 3)
                {
                    int num4 = transform.TransformBlock(inputBuffer, inputOffset + num2, num5, outputBuffer, i);
                }
                else
                {
                    transform.TransformFinalBlock(inputBuffer, inputOffset + num2, num5).CopyTo(outputBuffer, i);
                }
                num2 += 3;
            }
            return outputBuffer;
        }

        public static string EncodeToString(byte[] inputBuffer)
        {
            return EncodeToString(inputBuffer, 0, inputBuffer.Length);
        }

        public static string EncodeToString(byte[] inputBuffer, int inputOffset, int inputCount)
        {
            byte[] bytes = Encode(inputBuffer, inputOffset, inputCount);
            return Encoding.ASCII.GetString(bytes);
        }

        public static string SafeBase64ToStandardBase64(string b64str)
        {
            StringBuilder builder = new StringBuilder(b64str);
            builder.Replace('_', '=');
            builder.Replace('[', '+');
            builder.Replace(']', '/');
            return builder.ToString();
        }

        public static string StandardBase64ToSafeBase64(string b64str)
        {
            StringBuilder builder = new StringBuilder(b64str);
            builder.Replace('=', '_');
            builder.Replace('+', '[');
            builder.Replace('/', ']');
            return builder.ToString();
        }
    }
}

代码的第二部分:

namespace GameSpy.Util
{
    using System;
    using System.Collections;
    using System.IO;

    public sealed class Gutils
    {
        public static DateTime UTCSecondsToDateTime(int seconds)
        {
            return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1) + new TimeSpan(0, 0, seconds));
        }
    }
}

        public static uint UTCSeconds()
    {
        TimeSpan span = (TimeSpan) (DateTime.UtcNow - new DateTime(0x7b2, 1, 1, 0, 0, 0, 0));
        return (uint) span.TotalSeconds;
    }

文件路径:

enter image description here

1 个答案:

答案 0 :(得分:2)

您需要告诉csc.exe您要编译哪些文件。由于您的Gutil类显然位于gutils.cs而不是LoginTicket.cs,因此当您仅编译LoginTicket.cs时,编译器无法找到它。

试试这个:

csc.exe LoginTicket.cs Gutils.cs

甚至

csc.exe *.cs

使用

csc.exe /?

获取更多命令行选项(例如通过子目录等递归...)

进一步阅读:RxBinding