CA1400:P/Invoke 入口点应该存在

类型名

PInvokeEntryPointsShouldExist

CheckId

CA1400

类别

Microsoft.Interoperability

是否重大更改

非重大更改

原因

公共方法或受保护方法是使用 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();
   }
}

请参见

参考

DllImportAttribute