【问题标题】:Importing native methods in Xamarin.Mac在 Xamarin.Mac 中导入本机方法
【发布时间】:2017-01-26 23:10:09
【问题描述】:

我正在寻找一种在我的 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),但它给出的是随机指针而不是有意义的值。

【问题讨论】:

  • 你有幸从 SCNetworkInterfaceCopyAll() 中提取值吗?
  • @AnoopVaidya,不幸的是,我不记得我是否设法修复它。
  • 没问题,我解决了。将其发布为答案

标签: xamarin interop marshalling dllimport xamarin.mac


【解决方案1】:

您能否使用System.Net.NetworkInformation. NetworkInterface 提供的信息(或者您是否真的需要SCNetworkInterface?)

Xamarin.Mac 示例:

foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
    if (nic.OperationalStatus == OperationalStatus.Up)
        Console.WriteLine(nic.GetPhysicalAddress());
}

【讨论】:

  • 不,我需要知道哪个接口是 WiFi,但不幸的是 GetAllNetworkInterfaces 出于某种原因将 WiFi 接口返回为以太网。
  • @ArturShamsutdinov 拥有无线接口后需要什么信息?
  • 基本上我的目标是返回具有 MAC 地址的活动以太网接口列表,不包括 WiFi 接口。
【解决方案2】:

查看 SCNetworkConfiguration.h,您可以在 IntPtr 上调用许多 C API 来检索您需要的特定信息。

CoreFoundation API 通常会返回您需要传递给其他函数的“指挥棒”指针。您在哪里看到该结构定义?

【讨论】:

    【解决方案3】:

    您可以在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2018-06-16
      • 1970-01-01
      • 2017-01-10
      • 2019-07-31
      相关资源
      最近更新 更多