命名空间“System.Drawing”中不存在“矩形”
-
14-11-2019 - |
题
使用.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);
}
所有其他引用的程序集都可以工作并且已经工作了很长时间。这是我第一次遇到这样的错误。
我已确保并仔细检查了参考文献是否已添加。如果我尝试再次将其添加到项目中,我会收到一条消息,指出引用已存在。
谢谢
解决方案
您在注释和标签中声明这是由另一个应用程序动态编译的。因此,该其他申请很可能不包括 System.Drawing.dll
作为执行编译时的参考,因此类型未解析。仅仅陈述是不够的 using System.Drawing
, ,定义该命名空间及其类型的程序集也必须传递给编译器。
在代码中,这是使用 CompilerParameters
实例通过其中之一传递 CompileAssemblyFrom...
致电 CodeDomProvider
正在执行编译的实例(在本例中, CSharpCodeProvider
)。这 CompilerParameters.ReferencedAssemblies
集合向编译器指示在尝试执行类型解析时要查看哪些程序集。
更新
尝试显式添加 mscorlib
到参考文献。
另外,我不知道这是否相关,但正如您提到的服务器(它是某种服务吗?), MSDN 指出:
系统中的类。在Windows或ASP.NET服务中不支持Drawing名称空间。尝试从这些应用程序类型之一中使用这些类别可能会产生意外的问题,例如服务性能降低和运行时间异常。有关支持的替代方案,请参阅Windows成像组件。
我想说这属于意外问题,尽管我不希望问题在编译过程中出现,而是在执行代码时出现。也就是说,他们并没有在文档中真正指定这一点,因此它可以适用于使用 System.Drawing.dll
一般作为参考。