处置X509Chain

时间:2015-08-03 16:05:52

标签: c# .net

在针对.NET Framework 4.5.1的Visual Studio 2013中,我发现处理X509Chain比预期更困难。根据MSDN文档,从X509Chain开始是一次性的。 reference source证实了这一点,用ildasm查看课程也证实了这一点:

X509Chain in ildasm

然而,当试图将它放入如下的使用语句时:

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的演员会成功,而且会被召唤。

认为问题是因为C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.1中的引用程序集实现IDisposable,即使在运行时使用的实际程序集也是如此。

有没有办法可以干净地处理X509Chain而无需进行尝试/最终投射自己,即我可以在using声明中使用它吗?我想我可以自己封装这个类,但是我不想引入一个新类型,我宁愿让编译器为我做这个工作。

看起来参考组件在4.5.2中有相同的问题,但它在4.6中是固定的,但是现在没有在雷达上移动到4.6。

1 个答案:

答案 0 :(得分:3)

我得到了微软的回复(感谢微软!)。

事实证明这是.NET 4.6 Framework中的新功能,MSDN文档尚未将4.5到4.6之间的更改分成单独的部分,并且页面没有特别提及。

我还犯了在本地安装.NET 4.6框架的错误 - 这意味着在运行时的实际组装是4.6。如果我一直处于4.5的环境中,我只会看到演员表失败并且处理将永远不会被调用。