作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为如何正确调用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/
我是一名优秀的程序员,十分优秀!