Ответ 1
После многократного поиска я нашел нужную информацию, используя NetworkInformation и HostName.
NetworkInformation.GetInternetConnectionProfile извлекает профиль подключения, связанный с подключением к Интернету, которое в настоящее время используется локальной машиной.
NetworkInformation.GetHostNames извлекает список имен хостов. Это не очевидно, но это включает адреса IPv4 и IPv6 в виде строк.
Используя эту информацию, мы можем получить IP-адрес сетевого адаптера, подключенного к Интернету следующим образом:
public string CurrentIPAddress()
{
var icp = NetworkInformation.GetInternetConnectionProfile();
if (icp != null && icp.NetworkAdapter != null)
{
var hostname =
NetworkInformation.GetHostNames()
.SingleOrDefault(
hn =>
hn.IPInformation != null && hn.IPInformation.NetworkAdapter != null
&& hn.IPInformation.NetworkAdapter.NetworkAdapterId
== icp.NetworkAdapter.NetworkAdapterId);
if (hostname != null)
{
// the ip address
return hostname.CanonicalName;
}
}
return string.Empty;
}
Обратите внимание, что HostName имеет свойства CanonicalName, DisplayName и RawName, но все они возвращают одну и ту же строку.
Мы также можем получить адреса для нескольких адаптеров с кодом, подобным этому:
private IEnumerable<string> GetCurrentIpAddresses()
{
var profiles = NetworkInformation.GetConnectionProfiles().ToList();
// the Internet connection profile doesn't seem to be in the above list
profiles.Add(NetworkInformation.GetInternetConnectionProfile());
IEnumerable<HostName> hostnames =
NetworkInformation.GetHostNames().Where(h =>
h.IPInformation != null &&
h.IPInformation.NetworkAdapter != null).ToList();
return (from h in hostnames
from p in profiles
where h.IPInformation.NetworkAdapter.NetworkAdapterId ==
p.NetworkAdapter.NetworkAdapterId
select string.Format("{0}, {1}", p.ProfileName, h.CanonicalName)).ToList();
}