C#中用SslEmptyCache系统API来清除SSL状态
如果需要编程实现IE选项中清除SSL状态的功能,可用SslEmptyCache函数,SslEmptyCache函数定义在Schannel.dll中,采用动态链接即可。
代码如下:
using System;
using System.Runtime.InteropServices;
namespace Demo
{
public class Ssl
{
[DllImport("kernel32.dll")]
internal static extern IntPtr LoadLibrary(String dllname);
[DllImport("kernel32.dll")]
internal static extern IntPtr GetProcAddress(IntPtr hModule, String procname);
internal delegate bool SslEmptyCacheHelper(IntPtr targetName, int flags);
/// <summary>
/// UNICODE版
/// </summary>
/// <returns></returns>
public bool SslEmptyCacheW()
{
IntPtr schannel = LoadLibrary("Schannel.dll");
IntPtr procaddr = GetProcAddress(schannel, "SslEmptyCacheW");
SslEmptyCacheHelper helper = (SslEmptyCacheHelper)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(SslEmptyCacheHelper));
return helper(IntPtr.Zero, 0);
}
/// <summary>
/// ANSI版
/// </summary>
/// <returns></returns>
public bool SslEmptyCacheA()
{
IntPtr schannel = LoadLibrary("Schannel.dll");
IntPtr procaddr = GetProcAddress(schannel, "SslEmptyCacheA");
SslEmptyCacheHelper helper = (SslEmptyCacheHelper)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(SslEmptyCacheHelper));
return helper(IntPtr.Zero, 0);
}
}
using System.Runtime.InteropServices;
namespace Demo
{
public class Ssl
{
[DllImport("kernel32.dll")]
internal static extern IntPtr LoadLibrary(String dllname);
[DllImport("kernel32.dll")]
internal static extern IntPtr GetProcAddress(IntPtr hModule, String procname);
internal delegate bool SslEmptyCacheHelper(IntPtr targetName, int flags);
/// <summary>
/// UNICODE版
/// </summary>
/// <returns></returns>
public bool SslEmptyCacheW()
{
IntPtr schannel = LoadLibrary("Schannel.dll");
IntPtr procaddr = GetProcAddress(schannel, "SslEmptyCacheW");
SslEmptyCacheHelper helper = (SslEmptyCacheHelper)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(SslEmptyCacheHelper));
return helper(IntPtr.Zero, 0);
}
/// <summary>
/// ANSI版
/// </summary>
/// <returns></returns>
public bool SslEmptyCacheA()
{
IntPtr schannel = LoadLibrary("Schannel.dll");
IntPtr procaddr = GetProcAddress(schannel, "SslEmptyCacheA");
SslEmptyCacheHelper helper = (SslEmptyCacheHelper)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(SslEmptyCacheHelper));
return helper(IntPtr.Zero, 0);
}
}
}
参考资料:
2、.NET 2.0 中 GetDelegateForFunctionPointer 函数实现原理浅析 [草稿]