gpt4 book ai didi

C# - 在通用应用程序中获取 mac 地址

转载 作者:行者123 更新时间:2023-11-30 13:26:02 25 4
gpt4 key购买 nike

我正在开发 Windows 10 通用应用程序,我需要获取运行通用应用程序的设备的网络适配器的 MAC 地址。我查看了一下 MSDN,但我可以找到一种获取 mac 地址的方法,任何人都可以帮助我使用代码来获取 windows 10 通用应用程序中网络适配器的 mac 地址吗?

提前致谢。

最佳答案

嗯,我写了一些东西,但我没有在移动设备上测试它,因为我现在没有,但我在我的 PC 和 Windows Mobile 10 模拟器上测试了它。

public static class AdaptersHelper
{
const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
const int ERROR_BUFFER_OVERFLOW = 111;
const int MAX_ADAPTER_NAME_LENGTH = 256;
const int MAX_ADAPTER_ADDRESS_LENGTH = 8;
const int MIB_IF_TYPE_OTHER = 1;
const int MIB_IF_TYPE_ETHERNET = 6;
const int MIB_IF_TYPE_TOKENRING = 9;
const int MIB_IF_TYPE_FDDI = 15;
const int MIB_IF_TYPE_PPP = 23;
const int MIB_IF_TYPE_LOOPBACK = 24;
const int MIB_IF_TYPE_SLIP = 28;

[DllImport("iphlpapi.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern int GetAdaptersInfo(IntPtr pAdapterInfo, ref Int64 pBufOutLen);

public static List<AdapterInfo> GetAdapters()
{
var adapters = new List<AdapterInfo>();

long structSize = Marshal.SizeOf(typeof(IP_ADAPTER_INFO));
IntPtr pArray = Marshal.AllocHGlobal(new IntPtr(structSize));

int ret = GetAdaptersInfo(pArray, ref structSize);

if (ret == ERROR_BUFFER_OVERFLOW) // ERROR_BUFFER_OVERFLOW == 111
{
// Buffer was too small, reallocate the correct size for the buffer.
pArray = Marshal.ReAllocHGlobal(pArray, new IntPtr(structSize));

ret = GetAdaptersInfo(pArray, ref structSize);
}

if (ret == 0)
{
// Call Succeeded
IntPtr pEntry = pArray;

do
{
var adapter = new AdapterInfo();

// Retrieve the adapter info from the memory address
var entry = (IP_ADAPTER_INFO)Marshal.PtrToStructure(pEntry, typeof(IP_ADAPTER_INFO));

// Adapter Type
switch (entry.Type)
{
case MIB_IF_TYPE_ETHERNET:
adapter.Type = "Ethernet";
break;
case MIB_IF_TYPE_TOKENRING:
adapter.Type = "Token Ring";
break;
case MIB_IF_TYPE_FDDI:
adapter.Type = "FDDI";
break;
case MIB_IF_TYPE_PPP:
adapter.Type = "PPP";
break;
case MIB_IF_TYPE_LOOPBACK:
adapter.Type = "Loopback";
break;
case MIB_IF_TYPE_SLIP:
adapter.Type = "Slip";
break;
default:
adapter.Type = "Other/Unknown";
break;
} // switch

adapter.Name = entry.AdapterName;
adapter.Description = entry.AdapterDescription;

// MAC Address (data is in a byte[])
adapter.MAC = string.Join("-", Enumerable.Range(0, (int)entry.AddressLength).Select(s => string.Format("{0:X2}", entry.Address[s])));

// Get next adapter (if any)

adapters.Add(adapter);

pEntry = entry.Next;
}
while (pEntry != IntPtr.Zero);

Marshal.FreeHGlobal(pArray);
}
else
{
Marshal.FreeHGlobal(pArray);
throw new InvalidOperationException("GetAdaptersInfo failed: " + ret);
}

return adapters;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IP_ADAPTER_INFO
{
public IntPtr Next;
public Int32 ComboIndex;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_NAME_LENGTH + 4)]
public string AdapterName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]
public string AdapterDescription;
public UInt32 AddressLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]
public byte[] Address;
public Int32 Index;
public UInt32 Type;
public UInt32 DhcpEnabled;
public IntPtr CurrentIpAddress;
public IP_ADDR_STRING IpAddressList;
public IP_ADDR_STRING GatewayList;
public IP_ADDR_STRING DhcpServer;
public bool HaveWins;
public IP_ADDR_STRING PrimaryWinsServer;
public IP_ADDR_STRING SecondaryWinsServer;
public Int32 LeaseObtained;
public Int32 LeaseExpires;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IP_ADDR_STRING
{
public IntPtr Next;
public IP_ADDRESS_STRING IpAddress;
public IP_ADDRESS_STRING IpMask;
public Int32 Context;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IP_ADDRESS_STRING
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string Address;
}
}

还有我的 AdapterInfo 类:

public class AdapterInfo
{
public string Type { get; set; }

public string Description { get; set; }

public string Name { get; set; }

public string MAC { get; set; }
}

来源:http://www.pinvoke.net/default.aspx/iphlpapi/GetAdaptersInfo.html

关于C# - 在通用应用程序中获取 mac 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34097870/

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