Показать сообщение отдельно
Старый 05.09.2011, 18:01   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Подводный камень только один: решить, когда создавать SysExcelApplication нужно все-таки именно на клиенте, поскольку один и тот же серверный код может работать как в пакете, так и интерактивно, и в последнем случае, очевидно, Excel должен запускаться на клиентской машине. Я это решил так:
X++:
public static client server SysExcelApplication_NET construct(ClassRunMode _contructOnTier = ClassRunMode::Client)
{
    SysExcelApplication_NET ret;
    ;
    switch (_contructOnTier)
    {
        case ClassRunMode::Called :
        case ClassRunMode::ClientOrServer :
            ret = new SysExcelApplication_NET();
            break;
        case ClassRunMode::Client :
            ret = classFactory::makeObjectOnClient( classnum(SysExcelApplication_NET) );
            break;
        case ClassRunMode::Server :
            ret = classFactory::makeObjectOnServer( classnum(SysExcelApplication_NET) );
            break;
        default :
            throw error( Error::unsupportedEnumValue( _contructOnTier ) );
    }
    return ret;
}
public static client server SysExcelApplication construct()
{
    SysExcelApplication     ret;
    COM                     excel;
    real                    excelVersion;
    ;
    if (SysExcel::mustInteropViaNET())
    {
        return SysExcelApplication_NET::construct( clientKind() == ClientType::Server ? ClassRunMode::Server : ClassRunMode::Client );
    }
    // ...
Запрос всех InteropPermission'ов для взаимодействия с CLR на сервере в модификации реализован, так что вызывающий код об этом может не заботиться.