Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SetupVerifyInfFile-参数不正确。如何使用C#pinvoke_C#_Pinvoke - Fatal编程技术网

SetupVerifyInfFile-参数不正确。如何使用C#pinvoke

SetupVerifyInfFile-参数不正确。如何使用C#pinvoke,c#,pinvoke,C#,Pinvoke,我在呼叫/执行方面有问题。 调用VerifyInfFile函数时,收到异常“参数不正确” [DllImport(“setupapi.dll”,CharSet=CharSet.Auto,SetLastError=true)] 私有静态外部bool setupverifyinff文件( 字符串文件名, IntPtr AltPlatformInfo, 参考IntPtr InfSignerInfo); [StructLayout(LayoutKind.Sequential)] 公共结构SP\u INF\

我在呼叫/执行方面有问题。
调用
VerifyInfFile
函数时,收到异常“参数不正确”

[DllImport(“setupapi.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部bool setupverifyinff文件(
字符串文件名,
IntPtr AltPlatformInfo,
参考IntPtr InfSignerInfo);
[StructLayout(LayoutKind.Sequential)]
公共结构SP\u INF\u签名者\u INFO
{
公共机构的规模;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]
公共字符串目录文件;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]
公共字符串数字签名者;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]
公共字符串数字签名;
}
公共静态void VerifyInfFile(字符串infPath)
{
SP_INF_SIGNER_INFO infSignerInfo=默认值;
infSignerInfo.CbSize=Marshal.SizeOf(infSignerInfo);
var infSignerPtr=Marshal.AllocHGlobal(infSignerInfo.CbSize);
尝试
{
Marshal.StructureToPtr(infSignerInfo,infSignerPtr,false);
如果(!SetupVerifyInfFile(infPath,IntPtr.Zero,ref infSignerPtr))
抛出新异常(“调用SetupVerifyInfFile()时出错”,新建
Win32Exception(Marshal.GetLastWin32Error());
}
最后
{
弗里赫全球元帅(infSignerPtr);
}
}

我可以看到四个明显的错误:

  • 作为
    ref IntPtr InfSignerInfo
    传递的第三个参数。将其作为
    ref
    传递是错误的。如文档所述,此参数是指向结构的指针。因此,您需要删除
    ref
  • 您没有为
    SP\u INF\u SIGNER\u INFO
    指定字符集,因此将获得默认字符集,即ANSI。这与函数声明中的
    CharSet.Auto
    不匹配
  • 您为
    CbSize
    使用了错误的值。您可以提供指针的大小,但需要提供结构的大小,
    Marshal.SizeOf(typeof(SP\u INF\u SIGNER\u INFO))
  • 您对
    MAX\u PATH
    使用了不正确的值。正确的值是260,而不是256

  • Marshal.SizeOf(对象)
    已过时。如果改用
    Marshal.SizeOf()
    会发生什么?我检查了这个,得到了相同的错误。我不确定我是否100%很好地实现了INF\u SIGNER\u INFO结构或SetupVerifyInfFile方法。如果参数正确,则不会出现这种异常。也就是说:断言/假设可能不正确。我从
    ref InfSignerInfo
    中删除了
    ref
    。我还将
    CharSet.Auto
    添加到
    SP\u INF\u SIGNER\u INFO
    。现在它看起来像
    [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    。错误仍然出现。我做了您在第3点中所写的,但不幸的是,相同的错误仍在继续。对您更有用的是了解我如何调试所有这些。我创建了一个平凡的C++程序,它做同样的事情,并工作。通过检查
    CbSize
    的值,我得出了第4点。