CodeQL 文档

对非托管代码的调用

ID: cs/call-to-unmanaged-code
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - reliability
   - maintainability
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

Microsoft 为源代码定义了两大类。托管代码编译成字节码,然后由虚拟机执行。非托管代码直接编译成机器码。所有 C# 代码都是托管的,但可以调用外部非托管代码。此规则查找对由非托管代码实现的 extern 方法的调用。与非托管代码相比,托管代码有许多优势,例如由虚拟机执行的内置内存管理,以及能够在更广泛的体系结构上运行编译后的程序。

建议

考虑是否可以使用对托管代码的调用来代替。

示例

此示例显示了一个函数,该函数在被单击时显示一个消息框。它是使用 User32.dll 库中的非托管代码实现的。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public partial class UnmanagedCodeExample : Form
{
    [DllImport("User32.dll")]
    public static extern int MessageBox(int h, string m, string c, int type);

    private void btnSayHello_Click(object sender, EventArgs e)
    {
        MessageBox(0, "Hello World", "Title", 0); // BAD
    }
}

通过使用托管代码进行修复

此代码示例执行的操作完全相同,只是它使用托管代码来完成。

using System;
using System.Windows.Forms;

public partial class ManagedCodeExample : Form
{
    private void btnSayHello_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Hello World", "Title");
    }
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私