#c# #winforms #itext
#c# #winforms #itext
Вопрос:
После добавления следующих using
операторов в свой код я получаю множество неоднозначных ссылочных ошибок:
using iTextSharp.text;
using iTextSharp.text.pdf;
Это снимок экрана с ошибками:
Кто-нибудь знает, что вызывает эти ошибки? Как я могу ввести iTextSharp и избежать этих ошибок?
Комментарии:
1. вы добавили ссылку из
NuGet
или добавили ее вручную?2. похоже, что конфликт между двумя версиями одной и той же ссылки..
3. Я добавил его с помощью nuget
4. Похоже, что это преимущественно конфликт имен
System.Drawing
. Удалитеusing System.Drawing
и / или создайте псевдоним для одного из них.5. Но, спасибо, я использовал: System . Рисование. Например, прямоугольник.
Ответ №1:
Вы сталкиваетесь с чем-то очень нормальным, и ни один разработчик не назвал бы это «созданием ошибок». Когда разработчик пишет код на C #, он создает классы в определенном пространстве имен. Например: в iText мы создали классы, такие как Font
в пространстве iTextSharp.text
имен .
Очевидно, что имя класса Font
не очень оригинально, есть и другие библиотеки, которые используют то же имя в другом пространстве имен. Есть даже класс, названный Font
на языке программирования C #, точнее, в пространстве System.Drawing
имен .
Это совершенно нормально. Компилятор может легко увидеть разницу между iTextSharp.text.Font
и System.Drawing.Font
, потому что они имеют другое полное имя (то есть: полное имя класса, включая пространство имен).
В вашем коде вы путаете компилятор. Вы добавляете using
оператор, который позволяет компилятору использовать iTextSharp.text.Font
класс. Однако, когда вы используете Font
класс в своем коде, вы не указываете, какой Font
класс вы собираетесь использовать. Ваш компилятор спрашивает вас: вы имеете в виду использовать iTextSharp.text.Font
или System.Drawing.Font
? А также: вы имеете в виду использовать iTextSharp.text.Rectangle
или System.Drawing.Rectangle
?
Вы можете решить эту проблему, используя полное имя, чтобы компилятор больше не путался.
Например, без пространства имен ваш компилятор не знает, имели ли вы в виду:
pnlReport.DrawToBitMap(bm, new System.Drawing.Rectangle(0, 0, width, height));
или:
pnlReport.DrawToBitMap(bm, new iTextSharp.text.Rectangle(0, 0, width, height));
Поэтому вы должны использовать:
pnlReport.DrawToBitMap(bm, new System.Drawing.Rectangle(0, 0, width, height));
вместо:
pnlReport.DrawToBitMap(bm, Rectangle(0, 0, width, height));
Вы также можете использовать псевдонимы пространства имен, такие как:
using sys = System.Drawing;
для упрощения подобных вызовов:
pnlReport.DrawToBitMap(bm, new sys.Rectangle(0, 0, width, height));
Комментарии:
1. Вы также можете использовать псевдонимы пространства имен, например, используя sys = System . Рисование; для упрощения вызовов (было бы pnlReport . DrawToBitmap(bm, новая система. Прямоугольник (0, 0, ширина, высота)); затем)
2. Спасибо, я добавил ваш комментарий к своему ответу.