2012-03-23 66 views
1

這就是這種情況。我正在用C++編寫後端應用程序,我的同事們正在使用C#作爲前端。基本上,我的後端應用程序對從C#前端接收到的圖像執行圖像處理,並返回一個包含圖像數據的文本文件。 我們之前做的是將圖像寫入磁盤並以圖像的文件路徑作爲參數調用C++應用程序。但是,從磁盤寫入/讀取已成爲瓶頸,所以我們希望將C++應用程序轉換爲DLL。編寫一個C#.NET應用程序可以調用的C++ DLL?

在基本層面,我要的是通過一個DLL從我的C++應用程序到C#一個公開一個方法(C#應用程序是基於Web):

int ProcessImage(System::Bitmap^ image, System::String ^results) 

我怎麼能去關於這樣做?我正在使用VC++ Express 2008,我的C++代碼目前正在用CLR編譯(儘管我在裏面混合了很多本地C++代碼)。

我一直在四處尋找在網絡上,但我仍然停留在如何做到這一點。我認爲一個C++/CLI DLL是最好的選擇,但我該怎麼做? Writing a DLL in C/C++ for .Net interoperability

+1

[C++/CLI混合模式DLL創建]的可能重複(http://stackoverflow.com/questions/2691325/c-cli-mixed-mode-dll-creation) – 2012-03-23 00:15:17

回答

1

我終於想通了。你需要做的是:

  1. 在你的C++項目,設置在Visual C++的選項使用CLR ,這使得項目編譯C++/CLI一個
  2. 在你的C++項目,通過創建公共引用類公開方法:

    public ref class Interop 
    { 
    public: 
        //! Returns the version of this DLL 
        static System::String^ GetVersion() { 
         return "3.0.0.0"; 
        } 
    
        //! Processes an image (passed by reference) 
        System::Int32^ Process(Bitmap^ image); 
    } 
    
  3. 在C#程序,添加到您編譯
  4. 在C#程序中的C++ DLL的引用,調用這些方法(即Interop::Process(myBitmapInCS)

我相信這種方法被稱爲「隱式P/Invoke」 希望這有助於!

2

如果您標記您的C++函數爲「C」的功能,那麼就可以通過的PInvoke調用。

你的C函數看起來就像這樣:

extern "C" __declspec(dllexport) int Test() { 
    return 1; 
} 

你的C#參考值將是這樣的:

[DllImport("test.dll")] 
public static extern int Test(); 

如果你的C++函數是一個實例成員,那麼你仍然可以做,但它需要一些技巧。

+2

您還應該添加__stdcall到C++函數,或CallingConvention到DllImport – 2012-03-23 01:29:43

+1

我相信extern「C」可以防止函數/方法名稱混亂。 – 01100110 2012-03-23 02:37:16

+0

只能以與p/invoke兼容的方式導出全局名稱空間中的函數。忘記任何與類有關的事情,無論你指的是類的成員函數(靜態的還是非靜態的)或參數或返回值中的類類型。 – 2012-03-23 02:58:45

相關問題