Включить атрибут неуправляемого типа в интерфейс 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;

У меня нет возможности проверить это, но вы можете увидеть, работает ли это?

С уважением,

Йерун

Другие вопросы по тегам