gpt4 book ai didi

c# - 如何从 Xamarin iOS 调用 sysctl?

转载 作者:行者123 更新时间:2023-12-01 19:07:41 28 4
gpt4 key购买 nike

我正在为如何正确调用sysctlbyname而苦恼。直接来自C#。我已阅读 man page而且我认为我正在做的事情非常接近,只是编码搞砸了。

     [DllImport(MonoTouch.Constants.SystemLibrary)]  
internal static extern int sysctlbyname( [MarshalAs(UnmanagedType.LPStr)] string property, IntPtr output, IntPtr oldLen, IntPtr newp, uint newlen);

//only works on sysctls that return strings
public static string SystemStringInfo(string property)
{
GCHandle? lenh = null, valh = null;
try
{
object len = 0L;
lenh=GCHandle.Alloc(len, GCHandleType.Pinned);

byte[] val;
int status = sysctlbyname(property, IntPtr.Zero, GCHandle.ToIntPtr(lenh.Value), IntPtr.Zero, 0); //crash here
if (status == 0)
{

val = new byte[(Int64)len];
valh=GCHandle.Alloc(val, GCHandleType.Pinned);
status = sysctlbyname(property, GCHandle.ToIntPtr(valh.Value), GCHandle.ToIntPtr(lenh.Value), IntPtr.Zero, 0);
if (status == 0)
{
return Encoding.UTF8.GetString(val);
}
}
return null;
}
finally
{
if (lenh.HasValue)
{
lenh.Value.Free();
}
if (valh.HasValue)
{
valh.Value.Free();
}
}
}

它将正确地从 sysctlbyname 返回(使用 -1 )当我给它一个虚假的 sysctl 属性名称时,比如“foobar”。但是,当我给它取一个正确的名称时,如 kern.osrelease ,它会碰到那条线并卡住和/或崩溃。

出了什么问题,我该如何让它工作!?

最佳答案

我知道它不是“完整的”(我确信 newp 和 newlen 仍然需要修改,但我无论如何也不使用它们),但这是我最终让它工作的方法

[DllImport(MonoTouch.Constants.SystemLibrary)]  
internal static extern int sysctlbyname( [MarshalAs(UnmanagedType.LPStr)] string property, byte[] output, ref Int64 oldLen, IntPtr newp, uint newlen);

public static string SystemStringInfo(string property)
{
GCHandle? lenh = null, valh = null;
Int64 len = 0L;

byte[] val;
int status = sysctlbyname(property, null, ref len, IntPtr.Zero, 0);
if (status == 0)
{

val = new byte[(Int64) len];
status = sysctlbyname(property, val, ref len, IntPtr.Zero, 0);
if (status == 0)
{
return Encoding.UTF8.GetString(val);
}
}
return null;
}

关于c# - 如何从 Xamarin iOS 调用 sysctl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726486/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com