Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在我的代码中获取安全警告_C#_Asp.net_.net_Dll - Fatal编程技术网

C# 在我的代码中获取安全警告

C# 在我的代码中获取安全警告,c#,asp.net,.net,dll,C#,Asp.net,.net,Dll,我在VS2013中对我的项目进行代码分析,发现以下安全警告 CA5122 p/Invoke声明不应是安全关键的。P/Invoke方法“InfoParameters.GetVolumeInformationInvoke(字符串、StringBuilder、uint、out uint、out uint、out uint、StringBuilder、uint)”被标记为安全关键。由于P/Invokes只能由关键代码调用,因此应该将此声明标记为安全关键,或者将其注释完全删除以避免误导。AmericanE

我在VS2013中对我的项目进行代码分析,发现以下安全警告

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);

}
因此,根据mson提供的文档,我为我的方法创建了一个包装器方法,但仍然遇到同样的问题

[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);
    }
}
我尝试了@Lucca给出的建议,仍然得到了同样的警告。请参见下面的屏幕截图。

如果使用
[assembly:AllowPartiallyTrustedCallers]
属性来正确管理任何最终不安全的程序集调用的安全性,则需要
SecuritySafeCritical
SecurityCritical
属性。如果不需要
AllowPartiallyTrustedCallers
将其删除,警告将消失

这就是这里实际工作的代码(无论如何,仍然有一些关于编组的警告):


如果要使用
[assembly:AllowPartiallyTrustedCallers]
属性正确管理任何最终不安全的程序集调用的安全性,则需要
SecuritySafeCritical
SecurityCritical
属性。如果不需要
AllowPartiallyTrustedCallers
将其删除,警告将消失

这就是这里实际工作的代码(无论如何,仍然有一些关于编组的警告):


检查已尝试相同,我在我的question@MusicLovingIndianGirl-这不是已经从他们的问题中间联系起来了吗?是否有你认为OP遗漏的具体建议?如果是这样的话,就值得强调细节,而不是说“请阅读您说过已经阅读过的页面”,这真的是一个ASP.NET web应用程序吗?然后您会遇到安全问题,因为您的应用程序上下文可能不允许运行内核函数。是的,这是一个正在工作/运行的Asp.Net web应用程序检查已尝试相同的方法,我在question@MusicLovingIndianGirl-这不是已经从他们的问题中间联系起来了吗?是否有你认为OP遗漏的具体建议?如果是这样的话,就值得强调细节,而不是说“请阅读您说过已经阅读过的页面”,这真的是一个ASP.NET web应用程序吗?然后您会遇到安全问题,因为您的应用程序上下文可能不允许运行内核函数。是的,它是一个正在工作/运行的Asp.Net web应用程序。它已经存在,我忘了在我的问题中写入。这并不能解决issueboth方法已经在类中的问题,因为我修改了我的问题OK,我发现要释放此错误,需要使用[assembly:AllowPartiallyTrustedCallers];没有它,您就不会在安全调用方面出错。如果需要[assembly:AllowPartiallyTrustedCallers],则需要两个SecurityAttribute。我用它更新了答案。它已经在那里了,我忘了在我的问题里写。这并不能解决issueboth方法已经在类中的问题,因为我修改了我的问题OK,我发现要释放此错误,需要使用[assembly:AllowPartiallyTrustedCallers];没有它,您就不会在安全调用方面出错。如果需要[assembly:AllowPartiallyTrustedCallers],则需要两个SecurityAttribute。我用这个更新了答案。
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);
}