2010-01-15 55 views
6

如何將這段VB6代碼轉換爲C#?C#&VB6:如何將'with'語句轉換爲C#?

http://pastebin.com/f16e19351

我已經試過我自己並得到了這麼遠:

http://pastebin.com/f7ca199f0

編輯:代碼我正在翻譯中存在的位置: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx

+0

[C#相當於Visual Basic關鍵字的'可能的重複:'與'...'結束於'?](http://stackoverflow.com/questions/4174773/c-sharp-equivalent-for-visual-basic -key-end-with) – DaveInCaz 2016-09-06 15:32:22

+0

@DaveInCaz也許把另一個作爲一個重複,那麼因爲這個問題之前問過那個? – Zolomon 2016-09-09 08:26:34

回答

7

您尚未顯示EventThief代碼,這使得無法確切地說明。但總的來說:

With expression 
    .Foo = a 
    .Bar = b 
End With 

將轉化

var x = expression; 
x.Foo = a; 
x.Bar = b; 

(當然你也可以明確地指定類型...)

這裏的共同點是expression只計算一次。在你顯示的特定代碼中,當然不需要額外的變量,因爲表達式首先是局部變量只有

你的實際錯誤看起來就像EventThief.RIGHT_DOWN等類型,而不是WITH語句。

編輯:好的,你現在已經顯示原EventThief代碼確實使用布爾...但你還沒有表現出你的移植EventThief代碼。您寫道:

它說et.LEFT_UP是一個短期

...但它不應該。在原來它是一個Boolean,那麼爲什麼它是在您的端口short

+0

我在我的問題中添加了一個鏈接,請參閱編輯。只要搜索「eventthief」,你就能找到它。 – Zolomon 2010-01-15 12:09:22

+0

我不知道爲什麼它是短暫的,我使用tlbimp在這裏提到:http://www.csharp-station.com/Articles/CSharpAndActiveXDlls.aspx允許在.NET中使用ActiveX dll,我拿它它將它轉換爲一個簡短的東西或什麼?我只會嘗試手動將整個事情轉換爲C#。謝謝您的幫助! – Zolomon 2010-01-15 12:23:54

0

有與C#中的With不等價,據我所知,當引用其成員函數/屬性時,需要明確列出對象。

0

沒有C#等價物。

2

像這樣

With EventStealingInfo 
    .RIGHT_DOWN = True 
    .RIGHT_UP = True 
End With 

成爲

EventStealingInfo.RIGHT_DOWN = true; 
EventStealingInfo.RIGHT_UP = true; 
0

你就不能更改LEFT_UP的類型是一個布爾?

看着你的代碼和你使用EventThief的方式,你可能想要使用一個標誌枚舉,所以你可以設置個別位,然後進行按位比較。

+0

我得看看。謝謝! – Zolomon 2010-01-15 12:13:47

3

我也不太清楚,但我想在VB

With EventStealingInfo 
    .RIGHT_DOWN = True 
    .RIGHT_UP = True 
End With 

以下大致可以翻譯成

var EventStealingInfo = new EventThief(){ 
    RIGHT_DOWN = true, 
    RIGHT_UP = true 
}; 

其中RIGHT_UPRIGHT_DOWN是在EventStealingInfo類的公共屬性。

C#中的這個構造被稱爲Object Initializer

+0

@stakx:謝謝你指出。 – missingfaktor 2010-01-15 12:17:06

0

「with」關鍵字只是在設置多個屬性時保存重新輸入變量名稱的快捷方式。在C#中沒有等價物。

即使有您仍然有問題,你顯然是試圖分配一個布爾短數據類型的問題。

什麼是EventThief類?你可以簡單地使LEFT_UP字段爲布爾值嗎?

+0

看看我的問題中的編輯鏈接,搜索「EventThief」,你會發現它。 – Zolomon 2010-01-15 12:14:30

+0

實際上,它也緩存對象引用,如果必須通過追蹤嵌套的一系列屬性來解決該對象(或更糟糕的是創建臨時使用的實例的方法調用),則可以節省時間。當然你也可以通過首先創建一個新的臨時引用變量並使用它來手動緩存。 – Bob77 2010-01-16 16:59:52

1

我認爲這是更接近你可以去:

EventThief EventStealingInfo = new EventThief() 
{ 
    RIGHT_DOWN = true, 
    RIGHT_UP = true 
}; 
+0

我會回答這個答案(除了它應該真的說'... = new EventThief()')。對象初始化器可能是最接近Visual Basic的'With'語句的東西。 – stakx 2010-01-15 12:14:42

+0

ops,固定那個,ty – 2010-01-15 12:18:05

1

我可以叫你的建議選項A

  1. 以社區VB6 code爲基礎創建一個用於處理Windows掛鉤的DLL。
  2. 翻譯,爲C#

我可以建議選項B和選項C,我認爲這將是更容易?

選項B
1.首先Microsoft's C# code對付windows鉤子。
2.根據需要調整它,查看API稱爲VB6 code makes的API。

選項C
1.從community code利用內置VB6 DLL。
2.通過Interop從您的新C#應用程序調用該DLL。

+0

我先嚐試了選項2,然後當第一個失敗時嘗試了選項3。那是當我在EventThief結構中遇到錯誤類型的錯誤時,所以我嘗試了選項1,並且遇到了另一個錯誤,它提到有關GUID錯誤的一些錯誤,並且我迷失在做什麼。 – Zolomon 2010-01-15 14:05:12