奇怪的参考错误

本文关键字:错误 参考 | 更新日期: 2023-09-27 18:21:39

我在C#库中有以下代码:

using System;
using System.Drawing;
using System.IO;
using System.Text;
namespace Gameloop.Util.Web
{
    public class QPayload : IDisposable
    {
        private byte[] _content;
        private Stream _stream;
        public readonly bool IsStream;
        public QPayload()
        {
            Content = new byte[0];
            IsStream = false;
        }
        public QPayload(byte[] bytes)
        {
            Content = bytes;
            IsStream = false;
        }
        public QPayload(string chars, Encoding encoding = null)
        {
            if (encoding == null)
                encoding = Encoding.UTF8;
            Content = encoding.GetBytes(chars);
            IsStream = false;
        }
        public QPayload(Image image)
        {
            MemoryStream ms = new MemoryStream();
            image.Save(ms, image.RawFormat);
            Content = ms.ToArray();
            IsStream = false;
        }
        public QPayload(Stream stream, bool readNow = false)
        {
            if (readNow)
            {
                _content = ReadToEnd(stream);
                IsStream = false;
                return;
            }
            Stream = stream;
            IsStream = true;
        }
        public byte[] Content
        {
            get
            {
                if (_content != null)
                    return _content;
                return Content = ReadToEnd(_stream);
            }
            private set
            {
                _content = value ?? new byte[0];
            }
        }
        public Stream Stream
        {
            get
            {
                if (_stream != null)
                    return _stream;
                return Stream = new MemoryStream(Content);
            }
            private set
            {
                _stream = value ?? new MemoryStream(new byte[0]);
            }
        }
        public void Dispose()
        {
            Stream.Dispose();
        }
        public string AsString(Encoding encoding = null)
        {
            if (encoding == null)
                encoding = Encoding.UTF8;
            return encoding.GetString(Content);
        }
        public Image AsImage()
        {
            using (MemoryStream ms = new MemoryStream(Content))
            {
                return Image.FromStream(ms);
            }
        }
        public static byte[] ReadToEnd(Stream stream)
        {
            using (stream)
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    stream.CopyTo(memoryStream);
                    return memoryStream.ToArray();
                }
            }
        }
    }
}

当我试图在使用此库的项目中使用以下代码时,会出现错误。

QPayload pay = new QPayload("text");

类型"System.Drawing.Image"是在程序集中定义的,而不是引用。必须添加对程序集"System.Drawing,版本=4.0.0.0,区域性=中性,PublicKeyToken=xyz'

在这个库中,我还有许多其他类使用System.Web之类的引用。但是,当我使用这些类时,我不会错误地要求我引用System.Web之类。

为什么要求我引用一个仅由引用使用的类型?

奇怪的参考错误

您直接在构造函数参数中使用Image。您必须直接了解System.Drawing.Image才能使用您的类(即使您没有使用该构造函数)。这就是VS希望您添加该引用的原因,因为否则您就不能使用获取Image的构造函数,因为您的调用代码不知道Image类。

如果在其他类中,System.Web内容的使用是"内部"的,换句话说,构造函数、属性、方法等不直接可见,那么您的使用项目不需要了解System.Web。因此VS没有提及添加该引用。