在针对.NET Framework 4.5.1的Visual Studio 2013中,我发现处理X509Chain
比预期更困难。根据MSDN文档,从X509Chain
开始是一次性的。 reference source证实了这一点,用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。
答案 0 :(得分:3)
我得到了微软的回复(感谢微软!)。
事实证明这是.NET 4.6 Framework中的新功能,MSDN文档尚未将4.5到4.6之间的更改分成单独的部分,并且页面没有特别提及。
我还犯了在本地安装.NET 4.6框架的错误 - 这意味着在运行时的实际组装是4.6。如果我一直处于4.5的环境中,我只会看到演员表失败并且处理将永远不会被调用。