对非托管代码的调用¶
ID: cs/call-to-unmanaged-code
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- reliability
- maintainability
Query suites:
- csharp-security-and-quality.qls
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");
}
}