【问题标题】:Weird reference error奇怪的参考错误
【发布时间】:2015-11-11 17:31:03
【问题描述】:

我在 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 等没有错误。

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

【问题讨论】:

  • 你能在项目的“参考资料”文件夹中查看参考资料吗?更具体的 System.Drawing ?当这个 dll 被定位时,你能检查一下版本吗,它是你加载的 dll 的版本以及请求的(版本=4.0.0.0)

标签: c# visual-studio-2013


【解决方案1】:

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

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

【讨论】:

  • new QPayload("text")如何直接使用Image
  • @Hele 不会,但public QPayload(Image image) 会。
  • @Hele 你有一个构造函数public QPayload(Image image)
  • 有什么方法可以修改上面的代码,以便不需要引用它? (同时保持功能不变)
  • 是的,通过删除构造函数public QPayload(Image image) {}和方法public Image AsImage() {}。那当然是这个类需要的改变。如果您有其他类公开使用System.Drawing 的成员,那么您也需要修改这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2010-12-19
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多