【问题标题】:'Rectangle' does not exist in the namespace 'System.Drawing'命名空间“System.Drawing”中不存在“矩形”
【发布时间】:2011-08-26 15:24:48
【问题描述】:

使用 .NET 2.0。

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

这是我的using 声明:

using System.Drawing;

代码如下:

private static Rectangle rScreen;

这是这一行的错误:

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

为什么?

编辑:添加编译代码:

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 都可以工作并且已经工作了很长时间。这是我第一次遇到这样的错误。

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

谢谢

【问题讨论】:

  • 这是与 Visual Studio 的吗?您是否在编辑器中 Rectangle 一词的右下角看到一个小红方块并建议更正?你可以输入System.Drawing.Rectangle 来代替它吗?
  • 它在 Visual Studio 中编译得很好。这是在另一个包含 using 语句的应用程序中动态编译的。
  • a) 尝试使用类型的完整范围,b) 您的声明是否在 using 语句的范围内? c) 请编辑问题并解释动态编译的内容。
  • 请贴出编译代码。这就是这种情况下的错误代码。另外,您的开发机器上是否安装了 .NET 4?您确定它引用了所引用程序集的正确版本吗?

标签: winforms .net-2.0 dynamic-compilation


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 是的,我有:parameters.ReferencedAssemblies.Add("System.Drawing.dll");我什至尝试更改相对于其他 ReferencedAssemblies 的顺序。是的,没有想法了。
  • @user390480:但它没有找到它。您确定类型解析正确定位它吗?你知道它在寻找程序集时搜索的路径吗?发布您的编译代码 - 可能那里有错误。
  • 在我的本地机器上 System.Drawing.dll 的版本是 2.0.50727.5420 而在服务器上的版本是 2.0.50727.3053。那会有什么不同吗?
  • @user390480:什么有效?是mscorlib 还是“意外问题”?我很感兴趣。
猜你喜欢
  • 2023-01-23
  • 2016-09-02
  • 1970-01-01
  • 2011-10-19
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2010-10-21
相关资源
最近更新 更多