我在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”的引用, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = xyz'
我在这个库中有许多其他类使用像System.Web这样的引用。但是,当我使用这些类时,我没有错误要求我引用System.Web等。
为什么要求我引用仅供参考使用的类型?
答案 0 :(得分:3)
您正在构造函数参数中直接使用Image
。您必须具有System.Drawing.Image的直接知识才能使用您的类(即使您不使用该构造函数)。这就是VS希望你添加该引用的原因,因为否则你不能使用带有Image的构造函数,因为你的调用代码不知道Image
类。
如果在其他类中,System.Web
内容的使用是'内部',换句话说,构造函数,属性,方法等不能直接看到,那么你的使用项目不会我不需要了解System.Web
。因此,VS没有提及添加该引用。