2012-07-10 64 views
0

我正在C#項目中工作,並且我沒有C#經驗。我們有一組使用C++編寫的DLL,它們具有相同的類和相同的功能,但它們的工作方式不同。作爲一個例子,讓我們說我們的程序轉換BMP文件。我們有用於將BMP轉換爲JPG,BMP轉換爲PNG等的DLL。我們用C#編寫的程序應該以某種方式封裝這些DLL,但不能以靜態的方式進行封裝。我們希望能夠在運行時更改正在使用的DLL,並在需要時(也可以在運行時)添加新的DLL。就像插件一樣,如果你願意的話。在C#中使用在運行時確定的C++ DLL

你的建議是如何實施這種方法?

+0

這些DLL是否導出任何C++類,或者導出中只有PInvoke兼容函數? – Dennis 2012-07-10 05:38:44

+0

就目前爲止我從代碼中可以看到,它們只是PInvoke兼容的函數。 – hattenn 2012-07-10 05:43:38

回答

1

如果你不知道你所有的DLL文件都是提前設施,你可能需要調用Win32函數「LoadLibrary」「GetProcAddress」和「FreeLibrary」。據我所知,c#沒有辦法自動執行一種Dynamic PInvoke。有關更多信息,請參見this blog post

或者,您可以使用PInvoke爲每個DLL創建一個C#封裝,然後使用託管代理來調用函數。然後,通過更改委託,可以在運行時調用不同的函數(推測可能在不同的DLL中)。這取決於你在編譯時有一個你打算使用的DLL的完整列表。儘管如此,它比第一個選項強大得多。讓運行時爲您處理所有編組也更容易一千倍。有關更多信息,請參見this MSDN article

0

你可以使用externDLLImport像微軟,提供更多的細節Go hereHere

1

如果他們已經在C++中,我會選擇寫託管程序集在C++中。
這個walkthrough可能是一個起點。特別是C++的人不需要學習C#。
P/Invoke有點慢,但更深層次的問題是你的版本管理作爲P/Invoke會導致運行時異常,並且在發生變化時不會編譯錯誤。