winforms - 命名空间 'System.Drawing' 中不存在“矩形”

标签 winforms .net-2.0 dynamic-compilation

使用.NET 2.0。

System.Drawing 在我的引用文献列表中。

这是我的 using 语句:

using System.Drawing;

这是代码:

private static Rectangle rScreen;

这是该行的错误:

Error Text: The type or namespace name 'Rectangle' does not exist in the namespace 'System.Drawing' (are you missing an assembly reference?)

为什么?

编辑:添加编译代码:

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

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

谢谢

最佳答案

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

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

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

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

Classes within the System.Drawing namespace are not supported for use within a Windows or ASP.NET service. Attempting to use these classes from within one of these application types may produce unexpected problems, such as diminished service performance and run-time exceptions. For a supported alternative, see Windows Imaging Components.

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

关于winforms - 命名空间 'System.Drawing' 中不存在“矩形”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6021153/

相关文章:

.net - 尝试更改标签的边框颜色

c# - 尽管未更新,但 Winforms 控件闪烁

c# - 如何在 MenuItem 中放置图标

events - Application.ApplicationExit 事件是否可以在非 Winforms 应用程序中通知退出?

c# - .NET 表单 - 禁用控件丢失事件

haskell - 将字符串视为 Haskell 程序

haskell - System.Plugins 加载器似乎在看到一次失败后假设失败

c# - 使组件根据大小变化填充最大空白

c# - Datagridview全行选择但获取单个单元格值

c# - 如何从 UWP 中的字符串执行代码?