P/Invoke 入口点应该存在
更新:2007 年 11 月
TypeName |
PInvokeEntryPointsShouldExist |
CheckId |
CA1400 |
类别 |
Microsoft.Interoperability |
是否重大更改 |
否 |
原因
公共方法或受保护方法是使用 System.Runtime.InteropServices.DllImportAttribute 标记的。找不到非托管库,或者无法将方法与库中的函数匹配。如果该规则找不到与指定名称完全相同的方法名称,它会通过为该方法名称添加后缀“A”或“W”来查找该方法的 ANSI 或宽字符版本。如果找不到匹配项,该规则会尝试使用 __stdcall 名称格式(_MyMethod@12,其中 12 代表参数的长度)查找函数。如果找不到匹配项,并且方法名称以“#”开头,则该规则会按照序号引用(而不是名称引用)来搜索该函数。
规则说明
没有进行编译时检查以确保在引用的非托管 DLL 中存在使用 DllImportAttribute 进行标记的方法。如果库中不存在具有指定名称的函数,或者方法参数与函数参数不匹配,则公共语言运行库会引发异常。
如何修复冲突
若要修复与该规则的冲突,请更正具有 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();
}
}