|
![]() |
#1 |
Участник
|
2 gl00mie
Можете поподробней рассказать, что значить переписать на .NET ? Проблема взаимодействия Axapta c com-объектами под Windows7 и Winserver 2008 общеизвестна и на сколько я знаю в Microsofte пытаются ее решить, но как то не очень удачно (заплатки с периодическим обращением к объектами и т.д.) |
|
![]() |
#2 |
Участник
|
Взять классы-обертки для работы с 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 ); } ![]() Последний раз редактировалось gl00mie; 25.08.2011 в 14:20. Причина: очепятки |
|
|
За это сообщение автора поблагодарили: Stainless (1). |
Теги |
ax2009, excel |
|
|