«Прямоугольник» не существует в пространстве имен «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);
}
Все остальные ReferencedAssemblies работают и работают уже давно.Такая ошибка у меня впервые.
Я убедился и дважды проверил, что ссылка добавлена.Если я попытаюсь добавить его в проект еще раз, я получу сообщение о том, что ссылка уже существует.
Спасибо
Решение
В комментариях и тегах вы указываете, что это динамически компилируется другим приложением.Поэтому вполне вероятно, что это другое приложение не включает System.Drawing.dll
в качестве ссылки при выполнении компиляции, поэтому тип не разрешен.Недостаточно просто констатировать using System.Drawing
, сборка, определяющая это пространство имен и его типы, также должна быть передана компилятору.
В коде это делается с помощью CompilerParameters
экземпляр, переданный через один из CompileAssemblyFrom...
звонки в CodeDomProvider
экземпляр, выполняющий компиляцию (в данном случае CSharpCodeProvider
).А CompilerParameters.ReferencedAssemblies
Коллекция указывает компилятору, на какие сборки следует обращать внимание при попытке выполнить разрешение типов.
Обновлять
Попробуйте явно добавить mscorlib
к ссылкам.
Кроме того, я не знаю, связано ли это с этим, но, как вы упомянули сервер (это какой-то сервис?), MSDN заявляет:
Классы в системе. Распространение имен не поддерживается для использования в службе Windows или ASP.NET.Попытка использовать эти классы из одного из этих типов приложений может создать неожиданные проблемы, такие как снижение производительности обслуживания и исключения времени выполнения.Поддерживаемая альтернатива, см. Компоненты визуализации Windows.
Я бы сказал, что это квалифицируется как неожиданная проблема, хотя я бы не ожидал, что проблемы проявятся во время процесса компиляции, а скорее при выполнении кода.Тем не менее, они на самом деле не указывают это в документации, поэтому это может относиться к использованию System.Drawing.dll
как ссылка в целом.