2010-08-22 70 views
0

現在我正在將一個VB6項目移植到C#並且不斷收到此錯誤。似乎無法修復它在命名空間中。VB6轉換爲C#錯誤

問題:

//Expected class, delegate, enum, interface, or struct 
public string GetHostByAddress(long addr) 
{ 
    dynamic phe = null; 
    dynamic Ret = null; 
    HOSTENT heDestHost = default(HOSTENT); 
    dynamic hostname = null; 

    phe = gethostbyaddr(addr, 4, PF_INET); 
    if (phe) { 
     MemCopy(heDestHost, phe, hostent_size); 
     hostname == new String[256, 0]; 
     MemCopy(hostname, heDestHost.h_name, 256); 
     GetHostByAddress == Strings.Left(hostname, Strings.InStr(hostname, Strings.Chr(0)) - 1); 
    } else { 
     GetHostByAddress = WSA_NoName; 
    } 
} 

原來的方法是這樣的。

Public Function GetHostByAddress(ByVal addr As Long) As String 

    Dim phe&, Ret& 
    Dim heDestHost As HOSTENT 
    Dim hostname& 

    phe = gethostbyaddr(addr, 4, PF_INET) 
    If phe Then 
     MemCopy heDestHost, ByVal phe, hostent_size 
     hostname = String$(256, 0) 
     MemCopy ByVal hostname, ByVal heDestHost.h_name, 256 
     GetHostByAddress = Left$(hostname, InStr(hostname, Chr$(0)) - 1) 
     Else 
     GetHostByAddress = WSA_NoName 
    End If 

End Function 

未能理解爲什麼它不工作和沮喪。有什麼建議麼?

+0

它只是我或方法讀取「替代文字」? – 2010-08-22 04:12:33

+1

您是否使用轉換工具。因爲如果你是我想知道,所以我不使用它。 – 2010-08-22 04:18:44

+1

非常感謝您粘貼代碼的**圖片**,我們**無法複製和粘貼**,並且(在第二種情況下)沒有語法突出顯示。儘可能努力的方法**儘量爲那些應該幫助你的人提供幫助:) – Timwi 2010-08-22 04:19:09

回答

2

它看起來像你試圖定義一個方法超出任何類的範圍。

在C#中,以及在VB.NET中,所有方法都必須屬於一個類。附上你的代碼在一些任意的輔助類,使發佈的編譯器錯誤消失:

public static class MyHelperClass 
{ 
    // put your method definition here 
} 

您可能之後仍存在一些錯誤,但是,從它的外觀。例如,我不認爲這條線正在做你的想法:

hostname == String[256, 0]; 

也許你的意思是它做這樣的事情?

hostname = new string[256, 0]; // Note: one '=' symbol, 'new' keyword 
           // (Is allocation of a multidimensional array 
           // of strings what you want?) 

這些僅僅是基於您的代碼的細節的非常膚淺的觀察。對於你想要在這裏實現的更基本的問題更多有用的評論,我敦促你將Xiaofu'sChristopher Painter's的答案視爲比我更有價值。

+0

'String $(256,0)'大致等同於'new String('\ 0',256)'(因爲它分配了一個包含特定字符的字符串,重複了一定的次數)。但是,不會在.NET中分配固定大小的字符串,然後在其上使用「MemCopy」來初始化它們的內容。 – 2010-08-22 15:20:09

+0

謝謝!這就是它。現在有幾個失蹤的「{}」正在找出「With」功能。 – Nightforce2 2010-08-22 21:49:05

3

所有Dan Tao都說過,如果你想開始清理代碼,但是你錯過了很多明顯定義在你的VB6項目中的其他地方的東西,以使其工作原樣。

但我認爲這可能無法解決這裏的根本問題。它看起來像你試圖做的代碼的文字端口,而不重寫它來正常工作或利用.NET基類庫。

看看MSDN中的System.Net.Dns類。

如果你還沒有,我建議你閱讀一些教程或書籍,開始使用C#和.NET。它與VB6完全不同,你只會嘗試將它與C#聯繫起來。

+0

嗯事情是我知道如何使用.NET的優點我試圖通過它的方式來移植它,看看是否有看到功能差異此代碼是超過4,500行代碼,我已經手動翻譯它的大部分只是這個功能和VB6的「With」功能有關。這個函數實際上是在一個與其餘類相關的命名空間中。所以我不明白它是如何失蹤的。從技術上講,現在應該給我這個問題。 – Nightforce2 2010-08-22 19:44:34

+0

夠公平的。我仍然認爲這樣做會造成VB6代碼的字面端口問題,尤其是在懷疑使用動態的情況下,但我相信你有你的理由。 :) – Xiaofu 2010-08-23 13:58:06

5

您正在重新發明輪子。嘗試:

string ipAddress = "x.x.x.x"; 
string hostName = System.Net.Dns.GetHostEntry(ipAddress).HostName; 
+0

這是顯而易見的...但它的轉換不是爲了重塑。 – Nightforce2 2010-08-22 19:37:59