2016-05-19 35 views
1

VB6コードをC#(.NET 4.5.2)に移行してgethostnameメソッドを呼び出しているコードに貼り付けられました。名前。私が今までに見つけたすべてのコードサンプルは、 this codeを指しています。そして、私はC#のgethostnameメソッドを成功裏にPInvokeできなかったので、それに代わるものがあるかどうかを尋ねることはできません。C#でWSOCK32.DLL経由でコンピュータ名を取得

この

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


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

は、次のエラーで失敗します。

ランタイムは、致命的なエラーが発生しました。エラーのアドレスは、スレッド0xd88の0x6a13a84eにありました。エラーコードは0xc0000005です。このエラーは、CLRまたはユーザーコードの安全でない部分または検証不能な部分のバグである可能性があります。このバグの一般的な原因には、COM-interopまたはPInvokeのユーザーマーシャリングエラーがあり、スタックが破損する可能性があります。

私はまたSystem.Environment.MachineNameまたは「COMPUTERNAME」環境変数を使用して読んが、私は結果がどのようなgethostnameメソッドが返すよりも、どのように異なるかに興味があります。

どのようなオプションがありますか?

  • 私は、64ビットシステム上で開発していますが、私はそれについてはドキュメントを発見したので、これはWSOCK32.DLLでの作業に影響する場合/方法を知りません。
+2

これをピンボケしないでください。 .netライブラリを使用します。 –

+0

@DavidHeffernanもう少し詳しくお聞かせください。私は最初のメッセージにいくつかの可能なオプションを挙げましたが、結果が常に同じかどうかはわかりません。 – dvlsc

+0

私はいくつかの研究があなたに何を知る必要があるかを教えてくれると期待しています。 Websearchは私をここに連れて行きましたhttp://stackoverflow.com/questions/1768198/how-do-i-get-the-computer-name-in-net –

答えて

2

あなたはzero-lengthimmutable 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を使用してください。

+0

私は約2時間ウェブをブラウジングしてきましたが、それらのリンクには一度も行きませんでした。また、PInvokeを初めて使用する。ありがとうございました! – dvlsc

関連する問題