Подтвердить что ты не робот

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 все равно должен иметь атрибут (иначе почему бы атрибут существовать?)

4b9b3361

Ответ 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.