我在VS 2013中运行了我的项目的代码分析,并在安全警告下面找到了。
CA5122 P / Invoke声明不应该是安全关键的。 P / Invoke方法' InfoParameters.GetVolumeInformationInvoke(字符串,StringBuilder,uint,out uint,out uint,out uint,StringBuilder,uint)'被标记为安全关键。由于P / Invokes只能由关键代码调用,因此该声明应标记为安全关键,或者完全删除其注释以避免误导。 AmericanEPayWebPunch PunchInOutBLL.cs 785
代码如下
class InfoParameters
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern bool GetVolumeInformation(string Volume, StringBuilder VolumeName, uint VolumeNameSize, out uint SerialNumber, out uint SerialNumberLength, out uint flags, StringBuilder fs, uint fs_size);
}
因此,根据MS在https://msdn.microsoft.com/en-in/library/dn621099.aspx上提供的文档,我为我的方法创建了一个包装器方法,但仍然遇到同样的问题
[assembly: System.Security.AllowPartiallyTrustedCallers]
internal static class SafeNativeMethods
{
[System.Security.SecurityCritical]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "GetVolumeInformation")]
internal static extern bool GetVolumeInformationInvoke(string volume, StringBuilder volumeName, uint volumeNameSize,
out uint serialNumber, out uint serialNumberLength, out uint flags, StringBuilder fs, uint fsSize);
}
class InfoParameters
{
[SecuritySafeCritical]
public static bool GetVolumeInformation(string Volume, StringBuilder VolumeName, uint VolumeNameSize, out uint SerialNumber, out uint SerialNumberLength, out uint flags, StringBuilder fs, uint fs_size)
{
return SafeNativeMethods.GetVolumeInformationInvoke(Volume, VolumeName, VolumeNameSize, out SerialNumber, out SerialNumberLength, out flags, fs, fs_size);
}
}
答案 0 :(得分:0)
如果您使用SecuritySafeCritical
属性来正确管理任何最终不安全的程序集调用的安全性,则需要SecurityCritical
和[assembly: AllowPartiallyTrustedCallers]
属性。如果您不需要AllowPartiallyTrustedCallers
删除它,警告就会消失。
这是实际在这里工作的代码(无论如何,仍有一些关于编组的警告):
internal static class SafeNativeMethods
{
[SecurityCritical]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "GetVolumeInformation")]
internal static extern bool GetVolumeInformationInvoke(string volume, StringBuilder volumeName, uint volumeNameSize,
out uint serialNumber, out uint serialNumberLength, out uint flags, StringBuilder fs, uint fsSize);
}
[SecuritySafeCritical]
public static bool GetVolumeInformation(string Volume, StringBuilder VolumeName, uint VolumeNameSize, out uint SerialNumber, out uint SerialNumberLength, out uint flags, StringBuilder fs, uint fs_size)
{
return SafeNativeMethods.GetVolumeInformationInvoke(Volume, VolumeName, VolumeNameSize, out SerialNumber, out SerialNumberLength, out flags, fs, fs_size);
}