Поскольку вы создаете вспомогательный инструмент, просто добавьте обработчик сообщений 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
, которые я отправляю сразу после установки нового помощника или непосредственно перед тем, как планирую удалить или заменить установленный помощник.
Я думаю, что самый легкий путь состоит в том, чтобы использовать WPF, можно разместить управление WPF в приложении WinForms - Вы не должны переписывать свой GUI в WPF или чем-либо как этот.
больше информации здесь: http://msdn.microsoft.com/en-us/library/ms745781.aspx
На моей машине файлы XPS открываются автоматически через IE. Я просто отбросил бы управление WebBrowser на форме и перешел бы в файл XPS, затем называют Печать () методом.
Я просто вызываю Process.Start (XpsRchVw.exe, "pathtofile") если у вас установлен xps viewer EP, то это откроет ваш xps в xpsviewer и позволит вам использовать его для печати, редактирования и т. д. binks