我正在寻找在我的Xamarin.Mac应用中使用SCNetworkInterfaceCopyAll
的方法。
我已经导入了它
[DllImport("/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration")]
public static extern IntPtr SCNetworkInterfaceCopyAll();
然后我通过调用var array = NSArray.ArrayFromHandle<NSObject>(pointer)
得到一个数组。
但是无法弄清楚如何从SCNetworkInterface的输出数组中获取值。我试图将其整理为
[StructLayout(LayoutKind.Sequential)]
public struct Test
{
IntPtr interface_type;
IntPtr entity_hardware;
}
然后调用Marshal.PtrToStructure<Test>(i.Handle)
但它会提供随机指针而不是有意义的值。
答案 0 :(得分:0)
您可以使用System.Net.NetworkInformation. NetworkInterface
提供的信息(或者您确实需要SCNetworkInterface
吗?)
Xamarin.Mac
示例:foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
Console.WriteLine(nic.GetPhysicalAddress());
}
答案 1 :(得分:0)
查看SCNetworkConfiguration.h,您可以在IntPtr上调用许多C API来检索所需的特定信息。
CoreFoundation API经常返回您需要传递给其他函数的“指挥棒”指针。你在哪里看到结构定义?
答案 2 :(得分:0)
您可以在Xamarin中使用Objective-C方法获取MAC地址,因为C#提供了不同的MAC地址:
[DllImport("/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration")]
public static extern IntPtr SCNetworkInterfaceCopyAll();
[DllImport("/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration")]
public static extern IntPtr SCNetworkInterfaceGetHardwareAddressString(IntPtr scNetworkInterfaceRef);
private string MacAddress()
{
string address = string.Empty;
using (var interfaces = Runtime.GetNSObject<NSArray>(SCNetworkInterfaceCopyAll()))
{
for (nuint i = 0; i < interfaces.Count; i++)
{
IntPtr nic = interfaces.ValueAt(i);
var addressPtr = SCNetworkInterfaceGetHardwareAddressString(nic);
address = Runtime.GetNSObject<NSString>(addressPtr);
if (address != null) break;
}
}
return address;
}