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