2013-06-14 3 views
0

Я использую Xamarin.mac. Мне нужно получить полное доменное имя локального компьютера. В Windows этот код работает:Получить полное доменное имя в C#, запущенном на Mono

public string GetFQDN() 
{ 
    string domainName = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName; 
    string hostName = Dns.GetHostName(); 
    string fqdn = ""; 
    if (!hostName.Contains(domainName)) 
    fqdn = hostName + "." + domainName; 
    else 
    fqdn = hostName; 

    return fqdn; 
} 

На макинтош этот код вызывает эту ошибку: System.NotSupportedException: This platform is not supported.

Итак, что эквивалентно в Xamarin.mac? Или просто в Моно?

Просто получение имени компьютера было бы хорошим началом.

ответ

2

Для этого вы можете сделать то же самое, что и в C в системе UNIX, чтобы получить имя хоста с помощью gethostname(), а затем использовать поиск DNS, чтобы найти имя канонической сети для хоста. К счастью, у System.Net есть готовые призывы к этому. Следующий код должен работать как на OS X и Linux (на самом деле, на Linux это более или менее то, что hostname --fqdn делает):

using System; 
using System.Net; 

class Program { 
    static void Main() { 
    // Step 1: Get the host name 
    var hostname = Dns.GetHostName(); 
    // Step 2: Perform a DNS lookup. 
    // Note that the lookup is not guaranteed to succeed, especially 
    // if the system is misconfigured. On the other hand, if that 
    // happens, you probably can't connect to the host by name, anyway. 
    var hostinfo = Dns.GetHostEntry(hostname); 
    // Step 3: Retrieve the canonical name. 
    var fqdn = hostinfo.HostName; 
    Console.WriteLine("FQDN: {0}", fqdn); 
    } 
} 

Обратите внимание, что с неправильной настройкой DNS, то DNS поиск может произойти сбой, или вы можете получить довольно бесполезный «localhost.localdomain».

Если вы хотите эмулировать свой оригинальный подход, вы можете использовать следующий код, чтобы получить доменное имя:

var domainname = new StringBuilder(256); 
Mono.Unix.Native.Syscall.getdomainname(domainname, 
    (ulong) domainname.Capacity - 1); 

Вам нужно будет добавить Mono.Posix сборки вашей сборке для этого.

+0

Это отлично работало для моей ситуации. спасибо! – exvance

Смежные вопросы