6

使用 .NET 2.0。

System.Drawing在我的参考文献列表中。

这是我的using声明:

using System.Drawing;

这是代码:

private static Rectangle rScreen;

这是这一行的错误:

错误文本:命名空间“System.Drawing”中不存在类型或命名空间名称“矩形”(您是否缺少程序集引用?)

为什么?

编辑:添加编译代码:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("CompilerVersion", "v3.5");

CSharpCodeProvider codeProvider = new CSharpCodeProvider(dict);

CompilerParameters parameters = new CompilerParameters();

{
    parameters.ReferencedAssemblies.Add("System.Drawing.dll");

    parameters.ReferencedAssemblies.Add("System.dll");

    parameters.ReferencedAssemblies.Add("System.Core.dll");

    parameters.ReferencedAssemblies.Add("System.Data.dll");

    parameters.ReferencedAssemblies.Add("System.Data.Linq.dll");

    parameters.ReferencedAssemblies.Add("System.DirectoryServices.dll");

    parameters.ReferencedAssemblies.Add("System.Configuration.dll");

    parameters.ReferencedAssemblies.Add("System.Web.dll");

    parameters.ReferencedAssemblies.Add("System.Xml.dll");

    parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");

    parameters.ReferencedAssemblies.Add("System.Web.Services.dll");

    parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");

    parameters.ReferencedAssemblies.Add("System.IdentityModel.dll");

    parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.Common.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));

    parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.WebForms.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));
}

CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sources.ToArray());

try
{
    ApexAssemblyManager.dynamicAssemblies.Add(hashKey, new DynamicAssemlby(results.CompiledAssembly));

    return ApexAssemblyManager.dynamicAssemblies[hashKey].CreateInstance(typeName);
}

所有其他 ReferencedAssemblies 都可以工作并且已经工作了很长时间。这是我第一次遇到这样的错误。

我已确保并仔细检查了引用是否已添加。如果我再次尝试将其添加到项目中,我会收到一条消息,指出该引用已存在。

谢谢

4

1 回答 1

5

您在注释和标签中声明这是由另一个应用程序动态编译的。因此,在执行编译时,这个其他应用程序很可能没有System.Drawing.dll作为参考包括在内,因此类型是未解析的。仅仅声明是不够的using System.Drawing,定义该命名空间及其类型的程序集还必须传递给编译器。

在代码中,这是使用CompilerParameters通过CompileAssemblyFrom...调用之一传递给CodeDomProvider正在执行编译的实例(在本例中为CSharpCodeProvider)的实例来完成的。该CompilerParameters.ReferencedAssemblies集合向编译器指示在尝试执行类型解析时要查看哪些程序集。

更新
尝试显式添加mscorlib到引用。

另外,我不知道这是否相关,但是正如您提到的服务器(它是某种服务吗?),MSDN 指出

不支持在 Windows 或 ASP.NET 服务中使用 System.Drawing 命名空间中的类。尝试从这些应用程序类型之一中使用这些类可能会产生意想不到的问题,例如服务性能下降和运行时异常。有关受支持的替代方法,请参阅 Windows 映像组件。

我会说这是一个意外问题,尽管我不希望在编译过程中出现问题,而是在执行代码时出现问题。也就是说,他们并没有在文档中真正指定这一点,因此它通常适用于System.Drawing.dll用作参考。

于 2011-05-16T18:06:59.513 回答