2012-04-04 46 views
1

Delphi 4和/或5應用程序功能(.exe)是否可以集成到C#應用程序中?可以將Delphi 4和/或Delphi 5可執行文件集成到C#應用程序中嗎?

我一直在負責重寫將設關閉現有的Delphi 4/5的書面申請,這是目前一個批處理腳本,沒有人在我公司的理解結合在一起的新的應用程序。

作爲interum的解決方案,我已經要求調查一個C#GUI \包裝是否可以放置在頂部,這樣更容易維護和運行。

我知道德爾福6應用程序可在C#應用程序中使用反射調用,但我不完全知道如何。

所以回到我原來的問題可以德爾福4/5的應用功能被一個C#應用程序中調用?

在此先感謝。

+1

順便說一下,我不知道在哪裏會有反射。你確定這就是你的意思嗎? – 2012-04-04 16:07:41

+0

幾年前我只看了一下代碼,但它向我解釋說,它使用反射調用Delphi exe,然後在exe中調用某些方法。不幸的是,這是在以前的公司,我無法再訪問該代碼。 – zeencat 2012-04-04 16:16:26

+0

這沒有任何意義。 C#反射不能在Delphi exe下工作。 – 2012-04-04 16:21:13

回答

2

問題的基本前提似乎是圍繞Delphi核心的C#包裝更容易維護和運行,如果這不是真的,那麼創建包裝的想法就變得不是非常有用。我相信這是一個錯誤構思的概念。

想象一下,我提出了一個可以與望遠鏡交談的應用程序。它完美地完成了。在這種情況下,我可能只能提取望遠鏡通信部分,並將其放入DLL中,然後在C#中編寫用戶界面,該界面使用Delphi DLL來完成與望遠鏡的通信任務。然而,除非你的Delphi應用程序已經被很好的結構化了,除非像這個望遠鏡通信庫這樣的任務已經存在,否則你不會覺得很容易提取Delphi應用程序的任何部分,並從C#中使用它。如果這種情況存在,我會使用原生的Delphi DLL函數導出並從C#中調用它們。這不是使用現有的delphi可執行文件,需要花費很多工作時間來將Delphi應用程序的一部分重構爲可以從C#使用的東西。

另一個答案提到COM服務器,雖然這是可能的,但它不會讓事情變得簡單;像正式表達式的老玩笑一樣;當您遇到問題並嘗試使用正則表達式解決問題時,現在您遇到了兩個問題。當您嘗試使用COM服務器來隱藏您的現有應用程序並使用C#在其上編寫一個全新的UI時,情況也會如此。實際上,需要更多的技術技能來改進,調試並繼續以這種方式進行開發,而不是純粹用delphi或純粹用C#開發它。這是努力的積極節省。

您沒有提供有關Delphi應用程序的信息,但讓我們假設它是一種業務線或垂直市場應用程序,它讀取某種文件格式,或者執行某種通信協議,甚至連接到某個舊數據庫,你不想重寫。

如果通過製作C#用戶界面,您不需要顯示Delphi應用程序用戶界面並將其替換爲C#界面,幾乎可以確定您的想法不會讓任何事情變得更好,並且只能做到事情更糟。你的僵局要麼來自沒有熟練的delphi開發人員,要麼來自沒有聰明的開發人員能夠弄清現有應用程序的功能。

當您處於這種情況時,解決方案通常是一種人性化的解決方案;要麼僱用一名熟練的delphi開發人員,並將應用程序轉移到現代Delphi時代(Delphi XE2)中,要麼僱用一名熟練的非delphi開發人員,並將該應用程序移植到其他語言中。任何人都會建議在delphi應用程序的頂部寫一個「包裝器」,他認爲這會讓它「更容易」,顯然感覺不能重寫現有的應用程序。

我不太瞭解你的delphi應用程序的確如此,但它確實聽起來像「恐懼驅動」決定。包裝舊代碼幾乎不是一個好主意,而且最常見的是創建更多問題。

+0

我的任務是重寫應用程序,並有維護和開發Delphi軟件的經驗。我將把應用程序作爲一個長期解決方案移植到C#中,但同時我被問到是否可以創建一個包裝器來替換批處理腳本語言,以將它們組合在一起。我被一位沒有任何開發任何軟件開發經驗的經理問過這個問題。我同意全面重寫是最好的選擇,但我被要求調查是否有可能。 – zeencat 2012-04-12 09:55:21

+1

那麼,最好的選擇是不要重寫它,而是在移植到XE2後繼續在Delphi中維護它。但因爲你的任務比腦子更有權威,所以我祝你好運。 :-)(有數百家公司把他們的Delphi應用程序改寫成C#,通常是因爲他們認爲他們可以僱用更多的人爲他們工作,我認爲那是堅果,訓練人員。) – 2012-04-12 13:24:35

+0

感謝您的反饋。該業務是一個微軟合作伙伴,因此他們渴望將每一個軟件移植到.NET上。長期以來,我認爲這是最好的解決方案,因爲我是業內唯一的Delphi to C#開發人員。 – zeencat 2012-04-12 13:58:29

1

當然。 C#可以調用任何.exe。只需使用的Process.Start:

http://www.dotnetperls.com/process-start

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

+1

不完全是我的意思。我想從C#應用程序調用Delphi應用程序中的某些方法。不過謝謝。 – zeencat 2012-04-04 16:32:35

+1

@zeencat問題是這個問題。您通常不會調用.exe文件的方法。你只需運行它們。除非這個exe是一個COM服務器,但你沒有提到。您需要解決問題以包含一些真實的細節。 – 2012-04-04 16:42:43

1

德爾福5個支持實現COM服務器功能(不知道的早期版本,D2絕對沒有)。

如果有可用的資源,

2

Delphi .exe可以從C#運行。但我想這不是你的觀點。

您可以使用一個COM服務器,這是標準的,但需要(通過運行regsrv32.exe)的計算機上註冊的COM對象。部署不太容易。

,也可以定義德爾福代碼庫,然後加載並執行該.dll from the C# code。如果你喜歡從Delphi 4或5(即訪問C#RTTI)訪問C#對象,那麼你必須使用一些低級單元,如Managed extensions for VCL - .Net interop for Delphi Win32。這是相當完整的,並與舊版本的德爾福(但比Hydra更高層次將不支持德爾福4或5,悲哀地)工作。

編輯

另一個可能容易的通信是GDI消息。您可以從您的C#代碼發送GDI命令來控制Delphi應用程序,但使用PostMessage()API調用。

相關問題