我正在将一些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
方法返回的结果有何不同感兴趣。
我有哪些选择?
WSOCK32.DLL
,因为我找不到有关它的文档。答案 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代替。