2009-09-24 41 views
0

我有很多遺留代碼,我目前使用Borland C++ 3.0的過時安裝進行編譯。Dllimport無法導入舊的Borland DLL

這段代碼中有一個規則引擎,我想在C#.NET應用程序中進行提取和使用。

問題是,如果我將規則引擎提取到它自己的DLL中,我希望能夠從既沒有時間移植的現有遺留代碼中調用此DLL,也從C#.NET中調用此DLL應用程序。

如果我建立使用舊的Borland編譯一個DLL,我不能工作了如何從C#.NET項目中引用它。 DllImport因BadImageFormatException而失敗。使用這個異常表明大多數人在編譯一個支持64位的程序並在其中加載32位內容時遇到了這個問題。事情是,我確信我正在生成16位DLL,並且似乎沒有解決方法。

我可以下載新的Borland 5編譯器具有32位編譯器和鏈接,但我仍然得到同樣的問題,所以也許我有一些錯誤也有。

這是我的C#調用代碼

[DllImport("C:\\NSDB\\BorlandDLL\\BorlandDLL.dll", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] 
static extern int Version(); 

public frmHelpAbout() 
{ 
    InitializeComponent(); 

    lblIssueVersion.Text = + Version(); 
} 

這是我的DLL的代碼

int Version() 
{ 
    return 93; 
} 

我的編譯器標誌和鏈接標誌都是完整的猜測 - 我希望這是我的主要問題

我發現我的DLL的代碼不飾有像__stdcall,爲extern「C」或什麼東西。我似乎無法找到Borland C++ 3.0能夠理解的一組正確的符號來強制我需要的那種調用約定。

所以,問題:

1)威爾的DllImport永遠能夠從Borland的C++ 3.0 1B)如果沒有生成的代碼工作,我就能端口與Borland的C + 5.5工作代碼.1編譯器,並獲得DllImport與該工作?

2)我可以解決問題嗎?如果我將DLL代碼移植到.NET中,我是否能夠獲得舊的Borland代碼來調用它?

3)你是否有任何其他的創新解決方案,可以讓我簡單地提取從我這個老Borland的項目需要的代碼?

回答

1

據我所知,DllImport只適用於與.Net應用程序具有相同字大小的非託管dll。例如。在64位.Net應用程序中的DllImport只能在64位dll上工作,32位.Net應用程序只能裝載32位dll等。我也不認爲有可能讓DllImport加載16位位DLL。

一些可能的解決方案浮現在腦海中:

  1. 史蒂夫使用COM提及。如果你想保持你的.net應用程序爲64位,你可以使用COM來完成這樣的工作:將你的C代碼重新編譯爲一個32位的dll,使用.Net爲該dll編寫一個32位的COM包裝器,然後讓你的64位.Net應用程序調用32位COM服務器,這又會調用你的32位DLL。 MSDN有關於interoperating with unmanaged code的一些信息。

  2. 編譯你的dll和.net應用程序的32位。 DllImport應該能夠加載dll。 (您可能需要將您的C代碼打包到extern "C"中,然後在dll上運行TDUMP或DUMPBIN實用程序以檢查是否存在名稱損壞)。

  3. 如果您擁有所有C源代碼,那麼您能否忘記Borland編譯器並使用Visual Studio的C++編譯器構建代碼?

+0

我不認爲我可以做3 - 現在我必須保持現有程序的工作方式 - 並使用Borland的UI庫作爲控制檯。 我有一些代碼我與Borland coliming:外部的 「C」 INT __declspec(dllexport)的_stdcall的doAdd(INT I,詮釋J) { \t返回I + J; } 即使使用bcc32(我假設它是一個32位編譯器!)編譯並使用ilink32鏈接,我仍然無法獲得生成的DLL可加載。 如何知道生成的DLL是否真的是32位? – 2009-09-24 14:53:45

+0

我必須有一些在編譯器選項錯誤。使用帶-WD選項的bcc32生成一個可加載的DLL。 – 2009-09-24 15:18:46

0

.NET將調用COM,可以很愉快地稱爲COM(對於幸福適當COM調整值),因此,如果舊的本地代碼提供了一個合適的COM接口,你可以嘗試直接使用(但會需要使用32位版本)。

如果沒有需要的一切是在一個過程中,另一種方法是建立代碼爲C++/CLI裝配和作爲Borland的DLL(如果你有.c文件,那麼你就需要.cpp在.net項目中只有#include文件的.c文件)。

+0

對不起,我真的不明白你的帖子。 舊代碼只是一個C應用程序。它不會被拆分成庫或任何東西 - 它當然不提供COM接口。我希望提取這段代碼的有用部分,並留下所有的UI代碼。我必須從新的C#代碼調用規則引擎,並且我仍然必須從舊的Borland代碼中調用規則引擎。 我應該進一步瞭解COM(我從來沒有真正理解COM,儘管看到了很多縮寫)?你從哪裏開始?我喜歡這種想法,讓代碼在任一編譯器下編譯,但聽起來並不容易... – 2009-09-24 13:48:38

0

如果你使用32位.NET和32位C-DLL,你應該沒有問題。我幾乎100%肯定你不能輕鬆地從32位應用程序調用16位代碼(儘管我認爲我已經看到了這樣做的解決方案 - 「thunking」這個詞在我腦海中出現在這裏?)。

如果.NET和DLL都是32位的,你應該沒問題,但是我記得有一些關於Borland的DLL,這使得它們與其他「正常」的C-DLL不兼容。

Steve Gilham關於COM的答案可以忽略,我認爲,因爲COM既不必要也不是您的情況中的一個好選擇。