2015-08-03 4 views
10

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

X509Chain in ildasm

И все же, при попытке поставить его в использовании заявление так:

using (var chain = new X509Chain()) 
{ 

} 

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

Error 1 'System.Security.Cryptography.X509Certificates.X509Chain': type used in a using statement must be implicitly convertible to 'System.IDisposable'

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

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

var chain = new X509Chain(); 
try 
{ 

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

Действительно, приведение к IDisposable будет успешным, и распоряжаться будет вызван.

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

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

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

+1

Эта проблема раздражает. 'X509Certificate' (и, следовательно,' X509Certificate2') имеет ту же проблему. – vcsjones

ответ

3

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

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

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

Смежные вопросы