2010-12-20 84 views
1

我已經繼承了一個主要用VB編寫的項目。我想維護VB中的內容,並儘可能慢地轉換爲C#。我發現要做到這一點的唯一方法是創建一個單獨的C#項目。但是,由於依賴性和引用,這會導致問題。我不能有VBProject參考CSharpProject,反之亦然,因爲它創建一個循環引用。這是一個問題,因爲我需要兩個項目能夠引用其他項目。有沒有更好的方式來做到這一點,或者我堅持寫在VB中(或完全轉換爲C#)?拆分項目VB/C#和參考文獻

此外,這些項目是在相同的解決方案。我應該無法導入/使用它們,而無需創建參考或其他更簡單的方法?

回答

3

有沒有得到周圍不得不刪除循環引用。

當我在過去遇到類似的情況,從語言A轉換到語言B時,我開始通過重構語言A代碼的某些部分,以使它們獨立於大部分代碼庫。然後,我會將這些孤立的部分翻譯成語言B並整合,以便主程序現在取決於新模塊。最終,剩下的只是主要計劃。

這需要時間,但這種自下而上的方法非常有效,而且我得到了一個更加模塊化的程序。

1

當c#項目依賴於VB項目時,您將無法做到這一點。

您需要將VB.net項目中的類提取到c#項目中,以便類/函數獨立並且不依賴於VB項目。

這是我抗擊在每天的工作,我慢慢地走向光明移動(C#)

1

如果您不能提取出來的具體項目爲新的C#項目中引用,然後你」將不得不重寫所有。如果它是一個Web應用程序項目或一個Windows窗體項目,則不能在同一個項目中維護任何類型的混合。如果你有一個網站項目,你可以指定每個單獨頁面的語言,這將允許你有一個混合。然而,這是非常混亂的,你會發現自己分配時間用C#重寫它或者適應在VB中編寫時會更好。

2

Inversion of Control將極大地幫助您執行像這樣的遷移。當我被問到爲未經測試的管道式磁帶VB.Net代碼添加重要功能時,我最近解決了類似的問題。我想從VB.Net中提取現有的受影響的功能,並將其放入經過單元測試的C#程序集中。

如果您想要將類提取到新程序集,但會導致原始程序集中的依賴關係,那麼可以通過在由原始程序集依賴項實現的新程序集中定義契約接口來否定此問題。

例如,在VB.Net程序集中給出類Alpha,Bravo和Charlie,其中Alpha引用了Bravo。你想提取布拉沃,但它有一個參考查理。在C#項目中定義一個名爲ICharlie的接口,其中包含Bravo關心的查理成員。在VB.Net項目中,修改Charlie:ICharlie。當你構造Bravo時,它將接受ICharlie類型的依賴關係。

即使在同一個項目或一組項目中,這種方法的好處是可測試性。類之間的依賴關係是衆所周知的,可以用模擬/存根代替,這樣像Bravo這樣的類就可以進行測試,而無需擔心使用真正的ICharlie實現進行設置。

+0

但是,如果它是在C#項目中,VB項目如何知道ICharlie? – Jason 2010-12-21 00:43:37

+0

因爲VB.Net項目有一個對C#項目的引用。或者,如果您希望讓C#項目引用VB.Net項目,您可以在Bravo(C#)實現的VB.Net項目中定義一個接口IBravo。一般來說,我反其道而行之。在C#程序集中爲依賴關係定義了六個或更多接口,但在現有VB代碼中需要做的唯一更改是繼承接口以公開現有的公共方法。 – 2010-12-21 01:09:24