Подтвердить что ты не робот

Утилизация X509Chain

В Visual Studio 2013, ориентированном на .NET Framework 4.5.1, я считаю, что удаление X509Chain сложнее, чем ожидалось. Согласно документации MSDN, начиная с 4.5 X509Chain является одноразовым. Справочный источник подтверждает это, и просмотр класса с ildasm также подтверждает его:

X509Chain in ildasm

И все же, когда вы пытаетесь поместить его в оператор using следующим образом:

using (var chain = new X509Chain())
{

}

Я получаю ошибку компиляции:

Ошибка 1 'System.Security.Cryptography.X509Certificates.X509Chain': тип, используемый в операторе using, должен быть неявно преобразован в 'System.IDisposable'

Более смутно, определение Visual Studio класса говорит, что это не IDisposable.

Однако, если во время выполнения я делаю это:

var chain = new X509Chain();
try
{

}
finally
{
    var disposable = chain as IDisposable;
    if (disposable != null)
    {
        disposable.Dispose();
    }
}

В самом деле, приведение к IDisposable будет успешным, а dispose вызывается.

Я думаю, проблема связана с тем, что эталонная сборка в C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.1 не реализует IDisposable, хотя фактическая сборка, используемая во время выполнения,.

Есть ли способ, которым я могу полностью избавиться от X509Chain, не выполняя попытку/окончательно и не отбрасывая себя, то есть я могу заставить его работать в инструкции using? Я полагаю, что сам я мог бы обернуть класс, но я бы предпочел не вводить новый тип, я бы предпочел заставить компилятор выполнить эту работу для меня.

Похоже, что эталонная сборка имеет ту же самую проблему в 4.5.2, однако она исправлена ​​в 4.6, но переход на 4.6 не находится на радаре прямо сейчас.

4b9b3361

Ответ 1

Я получил ответ от Microsoft на это (спасибо Microsoft!).

Оказывается, это новое в .NET 4.6 Framework, документация MSDN еще не отделяет изменения от 4.5 до 4.6 на отдельные разделы, и на страницах это не упоминается конкретно.

Я также ошибся в том, что среда .NET 4.6 установлена ​​локально - это означает, что фактическая сборка во время выполнения была 4.6. Если бы я был в среде, которая была бы только 4.5, я бы увидел, что приказ не удался, и распоряжение никогда не было бы вызвано.