Включить атрибут неуправляемого типа в интерфейс COM
Я пишу интерфейсы COM в Oxygene для класса вызываемой оболочки COM. Я не могу понять, как маршалировать свойство System.Decimal в качестве валюты (собственный тип COM), так как компилятор Oxygene не допускает синтаксис, который работал для Delphi.NET.
Вот урезанный пример того, как я сделал это успешно в Delphi.NET
[ComVisible(True)]
IVarious = interface(IInterface)
['{2DBF9ACD-1574-4BE4-812A-5D0B8E9AA025}']
function get_MyString: String;
procedure set_MyString(strValue: String);
[return: MarshalAs(UnmanagedType.Currency)]
function get_MyAmount: System.Decimal;
procedure set_MyAmount([MarshalAs(UnmanagedType.Currency)] curValue: System.Decimal);
property MyString: String read get_MyString write set_MyString;
property MyAmount: System.Decimal read get_MyAmount write set_MyAmount;
end;
// In Delphi.NET the implementing class only needed to have the methods, not the properties
[ComVisible(False)]
[ClassInterface(ClassInterfaceType.None)]
TVarious = class(TObject, Various)
private
FMyString: string;
FMyAmount: System.Decimal;
public
function get_MyString: String;
procedure set_MyString(strValue: String);
[return: MarshalAs(UnmanagedType.Currency)]
function get_MyAmount: System.Decimal;
procedure set_MyAmount([MarshalAs(UnmanagedType.Currency)] curValue: System.Decimal);
end;
(Я не буду показывать реализацию метода getter и setter TVarious, поскольку они довольно очевидны.)
Я понимаю, что Oxygene не требует интерфейсов для объявления методов получения и установки. Мне кажется, что на самом деле это не позволяет вам использовать методы получения и установки. Таким образом, единственный способ, которым я могу преобразовать это в Oxygene (пока):
[ComVisible(True)]
[Guid('2DBF9ACD-1574-4BE4-812A-5D0B8E9AA025')]
IVarious = interface
property MyString: String read write;
property MyAmount: System.Decimal read write;
end;
[ComVisible(False)]
[ClassInterface(ClassInterfaceType.None)]
TVarious = class(IVarious)
public
property MyString: String;
property MyCurrency: System.Decimal;
end;
Но моя проблема в том, что я не смог выяснить, как включить атрибут [MarshalAs(UnmanagedType.Currency)] в любое из этих объявлений.
Помощь в том, как включить этот атрибут COM в интерфейсе будет принята с благодарностью.
1 ответ
Вы пробовали это:
[ComVisible(True)]
[Guid('2DBF9ACD-1574-4BE4-812A-5D0B8E9AA025')]
IVarious = interface
property MyString: String read write;
property MyAmount: System.Decimal read write;
end;
[ComVisible(False)]
[ClassInterface(ClassInterfaceType.None)]
TVarious = class(IVarious)
public
property MyString: String;
[var: MarshalAs(UnmanagedType.Currency)]
property MyAmount: System.Decimal;
end;
У меня нет возможности проверить это, но вы можете увидеть, работает ли это?
С уважением,
Йерун