我正在尝试修复另一个 VCL 错误;这次在
Vcl.Printers.pas
。
目前,我们通过将有问题的 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
...
这些方法中的每一种都会导致警告:
我可以删除这些属性。或者大概有一种方法可以抑制警告。但我认为 Embarcadero 添加的属性有一定的用途。
我真的想问:
我该如何让它发挥作用?
但我也很想知道:
为什么不起作用?
“为什么”使它成为一个更有用的问题,但“修复它”会很好。 奖金喋喋不休
是的的可能性。虽然大概绕道方法应该仍然具有该属性(否则为什么该属性会存在?) 错误消息有点误导。我会尽力为您翻译。当编译器说:
它的真正含义是:找不到派生自
TCustomAttribute
属性由 .net 框架定义,对于 Delphi .net 编译器有意义。 Embarcadero 仍然使用它来构建 IDE 的某些部分。因此,保留了条件代码,该代码会打开
这些PrintingPermission
CLR
定义的存在。当这个VCL单元被Delphi .net编译器编译时,编译器可以看到.net框架类
System.Drawing.Printing.PrintingPermissionAttribute
。
尝试处理 VCL 单元中的警告不会有什么收获。这不是您的代码,您修改 VCL 单元时的目标是尽快进入和退出。您应该致力于做出尽可能最小的改变。因此,请忽略警告。抑制您修改的 VCL 单元的警告和提示。在您编译的任何 VCL 单元的顶部添加
{$W-}
,然后继续。或者,如果您无法让自己变得如此严厉,您可以使用
{$WARN UNSUPPORTED_CONSTRUCT OFF}
。
依次回答您的问题:
这不是语言限制。只是这些属性仅在针对 .net 时定义。为什么VCL源代码中没有警告?
是的,至少在针对 .net 以外的目标进行编译时是这样。为什么 VCL 源代码可以使用而我却不允许?
如果您使用 .net 编译器,您也可以使用它们。这些属性有什么作用?
System.Drawing.Printing.PrintingPermissionAttribute
谁会阅读这些属性?
.net 框架。我猜。删除它们有问题吗?
它不会影响Windows编译器产生的输出。它会增加版本控制系统中的差异量。如果删除它们没有问题,为什么它们还在那里?
因为它们是在.net上使用的。