Сертификаты установки в к хранилищу сертификатов Windows Local user в C#

Документация Apple здесь https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextLayout/Tasks/CountLines.html должна быть полезна для того, что вы пытаетесь делать.

В своем примере подсчета строк обернутого текста они используют метод NSLayoutManager lineFragmentRectForGlyphAtIndex:effectiveRange https://developer.apple.com/documentation/appkit/nslayoutmanager/1403140-linefragmentrectforglyphatindex , чтобы найти эффективный диапазон линии, затем увеличьте индекс счета до конца этого диапазона (т.е. начиная со следующей строки). С некоторыми незначительными изменениями вы можете использовать его, чтобы найти диапазон линии, которую вы хотите выделить, а затем использовать setSelectedRange: NSTextView, чтобы выбрать его.

Вот это изменение, где, я полагаю, это будет работать для того, что вы пытаетесь выполнить:

- (void)selectLineNumber:(NSUInteger)lineNumberToSelect {
    NSLayoutManager *layoutManager = [self.testTextView layoutManager];
    NSUInteger numberOfLines = 0;
    NSUInteger numberOfGlyphs = [layoutManager numberOfGlyphs];
    NSRange lineRange;
    for (NSUInteger indexOfGlyph = 0; indexOfGlyph < numberOfGlyphs; numberOfLines++) {
        [layoutManager lineFragmentRectForGlyphAtIndex:indexOfGlyph effectiveRange:&lineRange];
        // check if we've found our line number
        if (numberOfLines == lineNumberToSelect) {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [self.testTextView setSelectedRange:lineRange];
            }];
            break;
        }
        indexOfGlyph = NSMaxRange(lineRange);
    }
}

Тогда вы можете назвать это как-то так:

[self selectLineNumber:3];

Имейте в виду, что мы начинаем с индекса 0. Если вы передаете lineNumberToSelect, который больше, чем numberOfLines, он должен быть просто неактивным, а выбор должен оставаться на своем месте.

7
задан Peter Mortensen 18 May 2016 в 14:17
поделиться

1 ответ

Оказывается, что сначала необходимо исполнить роль пользователя.

Пользование очень хорошей библиотекой описало в маленьком Классе C# для исполнения роли Пользователя, можно сделать следующее:

using (new Impersonator("username", "", "password"))
{
    try
    {
        X509Store serviceRuntimeUserCertificateStore = new X509Store(StoreName.My);
        string baseDir = AppDomain.CurrentDomain.BaseDirectory;
        string certPath = Path.Combine(baseDir, certificateFolder);

        string certificateFile = "c:\\file.cert";
        string certificatePassword = "somePassword";
        string certificateLocation = certPath + "\\" + certificateFile;

        InstallCertificate(certificateLocation, certificatePassword);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

private static void InstallCertificate(string certificatePath, string certificatePassword)
{
    try
    {
        var serviceRuntimeUserCertificateStore = new X509Store(StoreName.My);
        serviceRuntimeUserCertificateStore.Open(OpenFlags.ReadWrite);

        X509Certificate2 cert;

        try
        {
            cert = new X509Certificate2(certificatePath, certificatePassword);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Failed to load certificate " + certificatePath);
            throw new DataException("Certificate appeared to load successfully but also seems to be null.", ex);
        }

        serviceRuntimeUserCertificateStore.Add(cert);
        serviceRuntimeUserCertificateStore.Close();
    }
    catch(Exception)
    {
        Console.WriteLine("Failed to install {0}.  Check the certificate index entry and verify the certificate file exists.", certificatePath);
    }
}

Добавьте свою собственную обработку исключений. Если Вы добавляете, что несколько сертификатов сохраняют X509Store открытым в течение какого-то времени для эффективности.

12
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

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