相关疑难解决方法(0)

Pinvoke DeviceIoControl参数

我正在使用C#项目DeviceIoControl.我已经为我的签名咨询了相关的Pinvoke.net页面:

[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
public static extern bool DeviceIoControl(
    SafeFileHandle hDevice,
    EIOControlCode IoControlCode,

    [MarshalAs(UnmanagedType.AsAny)]
    [In] object InBuffer,
    uint nInBufferSize,

    [MarshalAs(UnmanagedType.AsAny)]
    [Out] object OutBuffer,
    uint nOutBufferSize,

    out uint pBytesReturned,
    [In] IntPtr Overlapped
    );
Run Code Online (Sandbox Code Playgroud)

我从来没有见过object和前,但MSDN文档听起来前途:[MarshalAs(UnmanagedType.AsAny)]

一种动态类型,它在运行时确定对象的类型,并将对象编组为该类型.该成员仅对平台调用方法有效.

我的问题是:使用此签名的"最佳"和/或"正确"方式是什么?

例如,IOCTL_STORAGE_QUERY_PROPERTY期望InBuffer是一个STORAGE_PROPERTY_QUERY结构.看起来我应该能够定义该结构,创建一个new实例,并将其传递给我的Pinvoke签名:

var query = new STORAGE_PROPERTY_QUERY { PropertyId = 0, QueryType = 0 };
DeviceIoControl(..., query, Marshal.SizeOf(query), ...);
Run Code Online (Sandbox Code Playgroud)

但是,我刚刚System.ExecutionEngineException做了这个,所以我改为:

int …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke deviceiocontrol

12
推荐指数
1
解决办法
7533
查看次数

标签 统计

c# ×1

deviceiocontrol ×1

pinvoke ×1