XPS с Windows Forms

Поскольку вы создаете вспомогательный инструмент, просто добавьте обработчик сообщений XPC, чтобы сообщить о состоянии вашего инструмента. Когда вы запустите, подключитесь и отправьте это сообщение. Если что-то из этого не получается, ваш инструмент установлен неправильно (или не отвечает).

В моем коде все мои службы XPC (включая моего привилегированного помощника) используют базовый протокол, используемый для тестирования и управления установками:

@protocol DDComponentInstalling /*<NSObject>*/

@required
- (void)queryBuildNumberWithReply:(void(^_Nonnull)(UInt32))reply;

@optional
- (void)didInstallComponent;
- (void)willUninstallComponent;

queryBuildNumberWithReply: возвращает целое число, описывающее номер версии компонента:

- (void)queryBuildNumberWithReply:(void(^)(UInt32))reply
{
    reply(FULL_BUILD_VERSION);
}

Если сообщение успешно, я сравниваю возвращаемое значение с константой номера сборки в моем приложении. Если они не совпадают, служба является более старой / более новой версией и должна быть заменена. Эта константа увеличивается с каждым публичным выпуском моего продукта.

Код, который я использую, выглядит примерно так:

- (BOOL)verifyServiceVersion
{
    DDConnection* connection = self.serviceConnection;
    id<DDComponentInstalling> proxy = connection.serviceProxy;  // get the proxy (will connect, as needed)
    if (proxy==nil)
        // an XPC connection could not be established or the proxy object could not be obtained
        return NO;  // assume service is not installed

    // Ask for the version number and wait for a response
    NSConditionLock* barrierLock = [[NSConditionLock alloc] initWithCondition:NO];
    __block UInt32 serviceVersion = UNKNOWN_BUILD_VERSION;
    [proxy queryBuildNumberWithReply:^(UInt32 version) {
        // Executes when service returns the build version
        [barrierLock lock];
        serviceVersion = version;
        [barrierLock unlockWithCondition:YES];  // signal to foreground thead that query is finished
        }];
    // wait for the message to reply
    [barrierLock lockWhenCondition:YES beforeDate:[NSDate dateWithTimeIntervalSinceNow:30.0];
    BOOL answer = (serviceVersion==FULL_BUILD_VERSION); // YES means helper is installed, alive, and correct version
    [barrierLock unlock];

    return answer;
}

Обратите внимание, что DDConnection - это служебная оболочка для соединений XPC, а трюк barrierLock фактически инкапсулирован в общем методе - поэтому я не заканчивайте тем, что пишете это снова и снова - но развернуто здесь для целей демонстрации.

У меня также есть проблемы до / после установки / обновления, поэтому во всех моих компонентах реализованы необязательные методы didInstallComponent и willUninstallComponent, которые я отправляю сразу после установки нового помощника или непосредственно перед тем, как планирую удалить или заменить установленный помощник.

5
задан Michael Damatov 10 October 2008 в 22:11
поделиться

3 ответа

Я думаю, что самый легкий путь состоит в том, чтобы использовать WPF, можно разместить управление WPF в приложении WinForms - Вы не должны переписывать свой GUI в WPF или чем-либо как этот.

больше информации здесь: http://msdn.microsoft.com/en-us/library/ms745781.aspx

4
ответ дан 14 December 2019 в 09:05
поделиться

На моей машине файлы XPS открываются автоматически через IE. Я просто отбросил бы управление WebBrowser на форме и перешел бы в файл XPS, затем называют Печать () методом.

3
ответ дан 14 December 2019 в 09:05
поделиться

Я просто вызываю Process.Start (XpsRchVw.exe, "pathtofile") если у вас установлен xps viewer EP, то это откроет ваш xps в xpsviewer и позволит вам использовать его для печати, редактирования и т. д. binks

0
ответ дан 14 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: