Vcl.Printers.pas(888): W1025 Функция неподдерживаемого языка: 'custom attribute'
Я пытаюсь исправить другую ошибку VCL; на этот раз в Vcl.Printers.pas
.
Теперь мы делаем это, копируя исходные файлы Buggy VCL в другую папку в пути библиотеки Delphi и применяя исправления к этим файлам. Мы применили исправление к TPrinter.SetPrinter
.
Но в файле есть шесть методов, которые украшены атрибутами:
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.Abort;
begin
...
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.EndDoc;
begin
...
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.NewPage;
begin
...
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
{$IF DEFINED(CLR)}
procedure TPrinter.SetPrinter(ADevice, ADriver, APort: string; ADeviceMode: IntPtr);
{$ELSE}
procedure TPrinter.SetPrinter(ADevice, ADriver, APort: PChar; ADeviceMode: THandle);
{$ENDIF}
var
...
[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
function SetPrinter(NewPrinter: TPrinter): TPrinter;
begin
...
Каждый из этих методов вызывает предупреждение:
- [dcc32 Warning] Vcl.Printers.pas(968): W1025 Функция неподдерживаемого языка: 'custom attribute'
- [dcc32 Warning] Vcl.Printers.pas(978): W1025 Неподдерживаемый язык: пользовательский атрибут
- [dcc32 Warning] Vcl.Printers.pas(1015): W1025 Неподдерживаемый язык: пользовательский атрибут
- [dcc32 Warning] Vcl.Printers.pas(1026): W1025 Функция неподдерживаемого языка: 'custom attribute'
- [dcc32 Warning] Vcl.Printers.pas(1080): W1025 Функция неподдерживаемого языка: 'custom attribute'
- [dcc32 Warning] Vcl.Printers.pas(1599): W1025 Неподдерживаемый язык: пользовательский атрибут
Я мог бы просто удалить атрибуты. Или, предположительно, есть способ подавить предупреждения. Но я предполагаю, что атрибуты, добавленные Embarcadero, имеют определенную цель.
- Каким образом язык поддерживает пользовательские атрибуты функции?
- Почему это не предупреждение в источнике VCL?
- Почему для источника VCL разрешено использовать его, когда я не?
- Что делают эти атрибуты?
- Кто читает эти атрибуты?
- Есть ли проблемы с их удалением?
- Если нет проблем с их удалением, почему они там?
Я действительно спрашиваю:
Как заставить его работать?
Но я также хотел бы знать:
Почему он не работает?
И почему делает это гораздо более полезным вопросом, но исправить его будет хорошо.
Бонус Chatter
Да, мы в конечном итоге планируем подумать о возможности изучения использования detours. Хотя предположительно метод detoured все равно должен иметь атрибут (иначе почему бы атрибут существовать?)
Ответы
Ответ 1
Сообщение об ошибке немного вводит в заблуждение. Я постараюсь перевести для вас. Когда компилятор говорит:
Функция неподдерживаемого языка: "пользовательский атрибут"
что это на самом деле означает:
Невозможно найти класс, полученный из TCustomAttribute
, который соответствует указанному имени атрибута.
Эти атрибуты PrintingPermission
, определенные структурой .net, имеют смысл для компилятора Delphi.net. Который по-прежнему используется Embarcadero для создания частей среды IDE. Следовательно, сохраняется сохранение условного кода, который включает присутствие CLR
. Когда этот модуль VCL компилируется компилятором Delphi.net, компилятор может видеть класс .net framework System.Drawing.Printing.PrintingPermissionAttribute
.
Там мало что можно получить, пытаясь разобраться с предупреждениями в единицах VCL. Это не ваш код, и ваша цель при модификации модуля VCL состоит в том, чтобы как можно быстрее войти и выйти. Вы должны стремиться сделать наименьшее изменение возможным.
Итак, игнорируйте предупреждения. Подавлять предупреждения и подсказки для модулей VCL, которые вы изменяете. Вещь {$W-}
вверху всех единиц VCL, которые вы компилируете, и двигайтесь дальше. Или, если вы просто не можете заставить себя быть настолько драконовским, вы можете использовать {$WARN UNSUPPORTED_CONSTRUCT OFF}
.
Принимая во внимание ваши вопросы:
Каким образом язык поддерживает пользовательские атрибуты функции?
Это не ограничение языка. Это просто, что эти атрибуты определяются только при таргетинге .net.
Почему это не предупреждение в источнике VCL?
Это, по крайней мере, при компиляции для цели, отличной от .net.
Почему для источника VCL разрешено использовать его, когда я не?
Вам также будет разрешено использовать их, если вы используете компилятор .net.
Что делают эти атрибуты?
System.Drawing.Printing.PrintingPermissionAttribute
Кто читает эти атрибуты?
Структура .net. Думаю.
Есть ли проблемы с их удалением?
Это не повлияет на результат, созданный компиляторами Windows. Это увеличит объем различий в вашей системе контроля версий.
Если нет проблем с их удалением, почему они там?
Потому что они используются в .net.