2011-04-16 73 views
5

我有一個以C#編寫的現有庫,它封裝了一個低得多的TCP/IP API,並將從服務器(專有二進制協議)傳出的消息暴露爲.NET事件。我還爲一個對象提供方法調用,該對象處理方便.NET類型(如System.DateTime)的編組複雜性,直至API需要的二進制編碼和固定長度結構(用於將消息發送到服務器)。在.NET庫的基礎上構建了大量現有的應用程序(內部使用並由第三方使用)。比從C#移植到Java更好的選擇嗎?

最近,我們已經找到了一個不想做抽象TCP/IP本身的所有工作的人,但他們的環境是嚴格的非Windows(我假設* nix,但我不是100%肯定),他們已經暗示他們的理想將會是Java可以調用的東西。

什麼來支持他們的需求的最佳途徑,而不必對我說:

  1. 代碼移植到現在,Java(包括非託管的DLL,我們目前的P/Invoke成解壓)
  2. 不得不保持兩個獨立的代碼基地前進(即使相同的bug修復和功能增強兩次)

我考慮過的一件事是將大部分核心TCP/IP功能一次性寫入更多跨平臺(C/C++)和n將我的.NET庫改爲這個(P/Invoke?)之上的一個薄層,然後在它上面寫一個類似的瘦Java層(JNI?)。

優點:

  • 我主要是把我的時間寫的東西只有一次。

缺點:

  • 大部分的代碼現在是不受管理 - 世界不是結束,而不是從一個生產力點理想(對我來說)。
  • 更長的開發時間(不能將C#套接字代碼移植到C/C++就像移植到Java一樣快)[這是多麼真實?]
  • 此時,基礎API大部分被包裝並且庫非常穩定,所以可能沒有太多新的開發 - 將當前代碼移植到Java並且在將來不得不偶爾修正錯誤或新開兩個新字段可能並不是那麼糟糕。
  • 我的現有客戶端應用程序的潛在不穩定性,而它們運行的​​版本在其下面發生了巨大變化。 (關於我的頭頂,我可以想到32/64位問題,字節順序問題,以及端口期間可能出現的一般錯誤等)

我簡要考慮過的另一個選項是以某種方式單聲道到Java,這樣我就可以利用我已有的所有現有C#代碼。儘管開發人員的體驗對於那些不得不使用它的Java開發人員來說有多平滑,但我還是不太清楚。我敢肯定,大多數代碼應該在Mono下運行時沒有問題(禁止解壓P/Invoke,它應該可能只是移植到C#中)。

我理想情況下不希望在我的代碼和客戶端Java應用程序之間添加另一層TCP/IP,管道等,如果我可以幫助它的話(所以WCF到Java端的WS-DeathStar可能不在) 。我從來沒有用Java做過任何認真的開發,但我爲這樣一個事實感到自豪:圖書館目前是第三方開發人員整合到他的應用程序中的一塊蛋糕(只要他運行.NET當然是: )),我希望能夠爲想要相同體驗的任何Java開發人員保持同樣的易用性。所以如果任何人對我提出的3個選項有意見(端口到Java &維護兩次,端口到C並且爲.NET和Java編寫精簡語言綁定,或嘗試集成Java和Mono)或任何我很樂意聽到他們的其他建議。

感謝

編輯:在客戶端(即去除碎電話AKA銷售部)直接與開發商溝通後的需求發生了變化不夠,這個問題已不再適用非常好我的眼前的形勢。但是,我會留下這個問題,希望我們能夠提出一些更好的建議。

在我的特殊情況下,客戶實際上除了Solaris之外還運行Windows計算機(現在誰還沒有?),並且很高興我們能夠在庫的頂部編寫應用程序(Windows服務)並提供很多更簡化和更小的TCP/IP API供他們進行編碼。我們將他們的簡單消息轉換爲下游系統可以理解的格式,並將傳入的響應轉換回給他們使用,以便他們可以通過他們的Java應用程序繼續與此下游系統進行交互。

再回到原來的場景想着這幾個星期後,我有幾個意見:

  • 在上面不同的語言綁定的便攜式基於C語言庫很可能是如果您事先知道您需要支持多種語言/平臺,那麼該走的路。

  • 在* nix上,單個進程可以同時託管Java運行時和Mono運行時嗎?我知道在早期版本的.NET中,你不能在同一個進程中擁有兩個不同的.NET運行時,但我相信他們已經用.NET 4解決了這個問題。如果可能的話,兩者之間如何溝通?理想情況下,您希望像靜態方法調用和代理一樣提供響應。

  • 如果有Java的&單間(方法&代表等)不容易直接的接口支持,可以考慮使用類似ZeroMQ協議緩存,或Apache節儉作爲郵件格式。由於ZeroMQ支持不同的傳輸,這將在進程內,進程間和網絡上運行。

回答

2

花更多時間在決定實施之前確定需求。在您知道需要什麼之前,您沒有任何設計選擇標準。

如果它是一個非Windows環境,例如,在那裏有任何.NET都沒有意義。

+0

我已經標記了你的答案是正確的,因爲我的要求最終改變了。但是,我對此並不滿意 - 在進行廣泛的需求分析後,仍然可能會出現這種互操作性需求的情況,所以我仍然希望能有更好的答案。 – 2011-05-12 15:14:29

+0

簡短的回答:不,我認爲沒有比從c#移植到Java更好的選擇:)但是這可能不是一個合適的解決方案,因爲客戶需要代碼,他願意付多少錢等等。 – 2011-05-12 16:50:19

1

你認爲單聲道?它很可能會支持非Windows環境中的現有代碼。訣竅是從java調用它,但單聲道的人可能也有一些可以幫助你。

1

這可能不是你的情況正確的解決方案,但出於完整性:

有跡象表明,可以針對JVM和幾種語言。特別是Ruby(JRuby和IronRuby)和Python(Jython和IronPython)。雖然現在.NET版本在JVM版本背後有很長的路要走,但Scala最終也可能會到達那裏。

無論如何,您可能會用Ruby或Python重寫您的庫,並同時針對兩個運行時。

0

我曾考慮過的一件事是將大部分核心TCP/IP功能重新寫入更多跨平臺(C/C++)的東西,然後將.NET庫更改爲薄層(P/Invoke?),然後在它上面寫一個類似的瘦Java層(JNI?)。

這是一種可能性。在Java方面,你應該考慮使用JNA而不是JNI。 (如果使用JNI,需要編寫C/C++代碼以使用特定於JNI的簽名。)

另一種可能性是將專有二進制協議替換爲使用多種編程語言「正常工作」的東西。這是CORBA和類似技術提供良好解決方案的問題空間。

2

如果您需要在Java虛擬機上運行的東西,但看起來很像C#,則應該檢出Stab。這對P/Invoke等沒有幫助,但您可能會發現將C#代碼移植到Java並維護它的工作量會減少。

雖然你應該看看Mono。我期望所有的C#代碼都可以不加修改地運行(除了觸及非託管DLL的部分外)。

我沒有使用它,但jni4net應該允許從Java調用.NET代碼。如果你的客戶想要一個Java接口,這可能是一個解決方案。

即使.NET兼容性不是優先級,我始終在Linux和Mac上使用Mono。我喜歡C#和.NET庫,並且更喜歡CLR到JVM。單聲道是麻省理工學院/ X11許可,這意味着如果你願意,你可以使用它商業。與其他人不同,我認爲沒有理由避免微軟支持技術,同時支持由Oracle和IBM倡導的技術。

使用Mono不會幫助您處理非託管位,儘管您仍然可以將P/Invoke調入本機DLL。您只需自己移植該DLL即可找到一些等價物。

你可能也想看看Mono Ahead of Time compilation

1

如果你真的想要的是能夠在.NET中編寫代碼並使其在JVM上運行,那麼你可以使用check out Grasshopper(2015-09:鏈接可能已經死掉)。這就是它設計的目的。

我知道Mainsoft傢伙多年來一直致力於Mono。如果我沒有記錯,他們爲Mono編寫了Visual Basic編譯器。

還有C# to Java converter from Tangible。我聽到了好東西,但我從來沒有用過它。

此外,它不會幫助你的情況,但我應該指出Mono for Android

Mono for Android以並行方式運行CLR和Dalvik VM。換句話說,您爲Android編寫的C#代碼可以調用Java庫(例如Android UI)並作爲單個應用程序執行。你曾問過在同一個進程中運行.NET和Java代碼的能力。顯然,它可以完成。