0

我正在使用 Xamarin.mac。我需要获取本地计算机的完全限定域名。在 Windows 上,此代码有效:

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

在 Mac 上,此代码会导致此错误:System.NotSupportedException: This platform is not supported.

那么,Xamarin.mac 中的等价物是什么?或者只是在单声道?

只是获得计算机名称将是一个好的开始。

4

1 回答 1

3

为此,您几乎可以在 UNIX 系统上执行与 C 语言相同的操作,即检索主机名,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程序集添加到您的构建中。

于 2013-06-14T20:34:12.363 回答