我正在尝试修复另一个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
...这些方法中的每一种都会引起警告:
我可以移除这些属性。或者大概有一种方法来压制警告。但我认为由Embarcadero添加的属性有一定的用途。
我真的在问:
我该怎么做呢?
但我也很想知道:
为什么不起作用?
而为什么使它成为一个更有用的问题,但修复它的会很好。
奖金喋喋不休
发布于 2014-09-09 14:12:01
错误信息有点误导。我会帮你翻译的。当编译器说:
不支持的语言特性:“自定义属性”
它真正的意思是:
无法找到从
TCustomAttribute派生的与您指定的属性名称匹配的类。
这些由PrintingPermission框架定义的.net属性对于Delphi .net编译器有意义。它仍然被Embarcadero用于构建IDE的部分。因此,保留了条件代码,它打开了CLR定义的存在。当这个VCL单元由Delphi编译器编译时,编译器可以看到.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上使用。
https://stackoverflow.com/questions/25746629
复制相似问题