C# 你可以放心地说这个代码是;“不安全”;

C# 你可以放心地说这个代码是;“不安全”;,c#,pinvoke,C#,Pinvoke,这是实现本机pinvok代码的calss 虽然我无法验证代码是否正确使用了不安全的代码,但它似乎仍然有效 不安全标志 struct IO_COUNTERS { public ulong ReadOperationCount; public ulong WriteOperationCount; public ulong OtherOperationCount; public ulong ReadTransferCoun

这是实现本机pinvok代码的calss

虽然我无法验证代码是否正确使用了不安全的代码,但它似乎仍然有效

不安全标志

    struct IO_COUNTERS
    {
        public ulong ReadOperationCount;
        public ulong WriteOperationCount;
        public ulong OtherOperationCount;
        public ulong ReadTransferCount;
        public ulong WriteTransferCount;
        public ulong OtherTransferCount;
    }
    [DllImport("kernel32.dll")]
    unsafe static extern bool GetProcessIoCounters(IntPtr* ProcessHandle, out IO_COUNTERS IoCounters);
使用我的“不安全”代码

其他信息:对象引用未设置为对象的实例。

这是我从上一个问题中得到的代码

Ok you need to change a few things, shown below

public static class IO
{
    unsafe public static Dictionary<string, ulong> GetALLIO(Process procToRtrivIO)
    {
        IO_COUNTERS* counters;
        Dictionary<string, ulong> retCountIoDict = new Dictionary<string, ulong>();
        IntPtr ptr = System.Diagnostics.Process.GetCurrentProcess().Handle;

        GetProcessIoCounters(&ptr, out counters);
        retCountIoDict.Add("ReadOperationCount", counters->ReadOperationCount);
        retCountIoDict.Add("WriteOperationCount", counters->WriteOperationCount);
        retCountIoDict.Add("OtherOperationCount", counters->OtherOperationCount);
        retCountIoDict.Add("ReadTransferCount", counters->ReadTransferCount);
        retCountIoDict.Add("WriteTransferCount", counters->WriteTransferCount);
        retCountIoDict.Add("OtherTransferCount", counters->OtherTransferCount);
        return retCountIoDict;
        //return  "This process has read " + ((counters.ReadTransferCount/1024)/1024).ToString("N0") +
        //    " Mb of data.";

    }
}
Ok您需要更改一些内容,如下所示
公共静态类IO
{
不安全的公共静态字典GetALLIO(进程进程进程)
{
IO_计数器*计数器;
字典retCountIoDict=新字典();
IntPtr ptr=System.Diagnostics.Process.GetCurrentProcess().Handle;
GetProcessIoCounters(&ptr,输出计数器);
添加(“ReadOperationCount”,计数器->ReadOperationCount);
添加(“WriteOperationCount”,计数器->WriteOperationCount);
添加(“其他操作计数”,计数器->其他操作计数);
添加(“ReadTransferCount”,计数器->ReadTransferCount);
添加(“WriteTransferCount”,计数器->WriteTransferCount);
添加(“其他转移计数”,计数器->其他转移计数);
返回retcountioct;
//return“此进程已读”+((counters.ReadTransferCount/1024)/1024).ToString(“N0”)+
//“Mb的数据。”;
}
}
所以问题是,我真的做到了吗。。。并安全地使用不安全代码(代码的顶部)
或者我遗漏了一些东西,如果我的代码没有问题(我仍然怀疑它没有完全使用不安全的配件),那么建议的代码版本有什么问题?

您的代码严重损坏。您对
GetProcessIoCounters
的声明是错误的。您正在传递进程句柄的地址,但需要按值传递进程句柄。更重要的是,这里根本不需要
不安全的
代码。我建议您停止使用
不安全的

下面是如何声明
GetProcessIoCounters

[DllImport(@"kernel32.dll", SetLastError=true)]
static extern bool GetProcessIoCounters(
    IntPtr hProcess, 
    out IO_COUNTERS IoCounters
);
您的
IO\u计数器声明可以

要调用函数,只需执行以下操作:

IO_COUNTERS IoCounters;
if (!GetProcessIoCounters(Process.GetCurrentProcess().Handle, out IoCounters))
    throw new Win32Exception();

嘿,谢谢你的代码,因为我真的忘记了没有不安全的东西是怎么回事了,虽然任务不是使用.net自己的类来获取信息,所以我至少可以获得一些性能测试,如果我从这个p/invoke实现中得到了多少,然后我对自己说,好的,让我们更进一步,测试p/invoke+unsafe,然后只测试p/invoke并返回到.net,因为如果p/invoke显示出一些良好的性能增益,我可能会使用它,但我不确定是否定期使用unsafe,尽管我只是尝试使用unsafe进行测试。使用unsafe不会使代码更快。在这里使用“不安全”没有任何意义。好吧,那就在签名中加上“bool”,这是一笔已签署的交易(:是的,当你的大脑比你的手指快一点点时就会发生这种情况(:我想我远不是一名程序员,但我至少可以成为一名优秀的打字质量保证员……:非常感谢你的光临。
[DllImport(@"kernel32.dll", SetLastError=true)]
static extern bool GetProcessIoCounters(
    IntPtr hProcess, 
    out IO_COUNTERS IoCounters
);
IO_COUNTERS IoCounters;
if (!GetProcessIoCounters(Process.GetCurrentProcess().Handle, out IoCounters))
    throw new Win32Exception();