CA1400:P/Invoke 入口点应该存在
类型名 |
PInvokeEntryPointsShouldExist |
CheckId |
CA1400 |
类别 |
Microsoft.Interoperability |
是否重大更改 |
非重大更改 |
原因
公共方法或受保护方法是使用 System.Runtime.InteropServices.DllImportAttribute 标记的。 未能找到非托管库,或者未能将方法与库中的函数匹配。 如果该规则找不到与指定名称完全相同的方法名称,它会通过为该方法名称添加后缀“A”或“W”来查找该方法的 ANSI 或宽字符版本。 如果找不到匹配项,该规则会尝试使用 __stdcall 名称格式(_MyMethod@12,其中 12 代表参数的长度)查找函数。 如果找不到匹配项,并且方法名称以“#”开头,则该规则会按照序号引用(而不是名称引用)来搜索该函数。
规则说明
没有编译检查以确保用 DllImportAttribute 标记的方法位于引用的非托管 DLL 中。 如果库中不存在具有指定名称的函数,或者方法参数与函数参数不匹配,则公共语言运行时会引发异常。
如何解决冲突
若要修复与该规则的冲突,请更正具有 DllImportAttribute 特性的方法。 确保非托管库存在并与包含该方法的程序集位于同一目录中。 如果该库存在且被正确引用,请验证方法名称、返回类型和参数签名是否与库函数匹配。
何时禁止显示警告
如果非托管库与引用它的托管程序集位于同一目录中,请不要禁止显示此规则发出的警告。 如果未能找到非托管库,则可以安全地禁止显示此规则发出的警告。
示例
下面的示例演示一个与该规则冲突的类型。 kernel32.dll 中没有名为 DoSomethingUnmanaged 的函数。
using System.Runtime.InteropServices;
namespace InteroperabilityLibrary
{
public class NativeMethods
{
// If DoSomethingUnmanaged does not exist, or has
// a different signature or return type, the following
// code violates rule PInvokeEntryPointsShouldExist.
[DllImport("kernel32.dll")]
public static extern void DoSomethingUnmanaged();
}
}