Цитата:
Сообщение от
Serg
Можете поподробней рассказать, что значить переписать на .NET?
Взять классы-обертки для работы с Excel и переделать их как-то так (на примере SysExcelCells):
X++:
public static client SysExcelCells construct(MSOfficeVersion _version, COM _cells, Microsoft.Office.Interop.Excel.Range _cells_net = null)
{
if (_cells_net)
{
return SysExcelCells_NET::construct( _version, _cells_net );
}
return new SysExcelCells(_cells, _version);
}
///////////////////////////////////////////////////////////////////////////////
// реализация обертки для работы с Excel через Microsoft.Office.Interop.Excel
class SysExcelCells_NET
extends SysExcelCells
{
Microsoft.Office.Interop.Excel.Range cells_net;
}
// возвращает ClrObject из пространства имен Microsoft.Office.Interop.Excel, оберткой для которого является экземпляр класса
// это часть внутренней инфраструктуры семейства классов SysExcel*, реализующих работу через .NET
protected CLRObject clrObject()
{
return cells_net;
}
public final COM comObject()
{
// copy-paste кода метода-обработчика comObject(), общего для классов SysExcel*, реализующих работу через .NET
str methodName = strfmt( '%1.%2', classid2name( classidget( this ) ), methodstr(SysExcel, comObject) );
throw error( strfmt( "@SYS75628", methodName, "@SYS95798" ) );
}
// способ, которым класс взаимодействует с Excel
// это часть внутренней инфраструктуры семейства классов SysExcel* для реализации кое-каких проверок
protected final InteropKind getXlInteropKind()
{
return InteropKind::ClrInterop;
}
public SysExcelCell item(int _row, int _column)
{
// предполагаем, что класс может работать и на сервере, при этом вызывающий код не должен знать детали взаимодействия с Excel
new InteropPermission( InteropKind::ClrInterop ).assert();
// BP deviation documented
return SysExcelCell::construct( version, null, cells_net.get_Item( _row, _column ) );
}
protected void new(Microsoft.Office.Interop.Excel.Range _cells_net, MSOfficeVersion _version)
{
super( null, _version );
cells_net = _cells_net;
}
public SysExcelRange range(str _range = '')
{
SysExcelRange ret;
;
if (_range != '')
{
new InteropPermission( InteropKind::ClrInterop ).assert();
// BP deviation documented
ret = SysExcelRange::construct( version, null, cells_net.get_Range( _range, this.getClrMissingArg() ) );
}
else
{
ret = SysExcelRange::construct( version, null, cells_net );
}
return ret;
}
public static SysExcelCells_NET construct(MSOfficeVersion _version, Microsoft.Office.Interop.Excel.Range _cells_net)
{
return new SysExcelCells_NET( _cells_net, _version );
}
Соотв., аналогично переписываем остальные классы, в SysExcelApplication::construct() реализуем возможность создания экземпляра класса-наследника, работающего через .NET, вычищаем весь код, дергающий SysExcel.comObject() - и готово