在Xamarin.Mac中导入本机方法

时间:2016-09-19 09:51:17

标签: xamarin interop marshalling dllimport xamarin.mac

我正在寻找在我的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)但它会提供随机指针而不是有意义的值。

3 个答案:

答案 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;
}