奇怪的参考错误
本文关键字:错误 参考 | 更新日期: 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没有提及添加该引用。