通过C#中的WSOCK32.DLL获取计算机名称

时间:2016-05-19 10:29:48

标签: c# .net dll vb6 pinvoke

我正在将一些VB6代码迁移到C#(.NET 4.5.2)并陷入一段代码,该代码从gethostname调用WSOCK32.DLL方法显然检索到电脑名称。到目前为止我找到的所有代码示例都指向了 this code。由于我无法在C#中成功PInvoke gethostname方法,我不禁要问是否有替代方法。

[DllImport("WSOCK32.DLL", SetLastError = true)]
internal static extern long gethostname(string name, int nameLen);


string host = string.Empty;
var res = gethostname(host, 256);

因以下错误而失败:

运行时遇到了致命错误。错误的地址位于0x6a13a84e,位于线程0xd88上。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会损坏堆栈。

我还阅读了有关使用System.Environment.MachineName或“COMPUTERNAME”环境变量的内容,但我对结果与gethostname方法返回的结果有何不同感兴趣。

我有哪些选择?

  • 我正在使用64位系统进行开发,但我不知道这是否会影响WSOCK32.DLL,因为我找不到有关它的文档。

1 个答案:

答案 0 :(得分:2)

您无法发送zero-length immutable C#string并期望它变成新的东西。您可能正在遇到缓冲区溢出。您需要使用StringBuilder代替:

[DllImport("WSOCK32.DLL", SetLastError = true)]
internal static extern long gethostname(StringBuilder name, int nameLen);

var builder = new StringBuilder(256);
var res = gethostname(builder, 256);
string host = builder.ToString();

更多信息:

此外,没有理由使用真正旧的DLL函数来获取本地计算机的名称。只需使用System.Environment.MachineName代替。