2011-07-26 45 views
0

我有一個用C++編寫的DLL,然後在C#程序中使用。 C#程序引用了DLL,我調用這些類並可以使用DLL中定義的函數。關於在C#中使用C++ DLL函數的問題#

現在我想添加其他功能到DLL,所以我可以在C#中運行C++代碼。我按照如何定義DLL中的其他函數的例子; .h和.cpp,我創建一個執行代碼的新函數。我把它放在與之前定義的函數相同的地方,但是當我把DLL放在我的C#代碼中時,我的函數不在那裏。當我創建一個DLL類的實例時,我的函數不是它的一部分。

我把它放在.h中作爲類的公共函數,並賦予它在.cpp中運行但未找到的代碼。

爲什麼我的C#程序看不到我製作的功能,即使它跟隨其他功能一樣的套件?

UPDATE

code.h:

#pragma once 

#include <windows.h> 
#include <PvDisplayWnd.h> 
#include <vfw.h> 
#include "NPvResult.h" 
#include "NPvDeviceInfo.h" 
#include "NPvBuffer.h" 
#include <string> 

using namespace System; 
using namespace System::Runtime::InteropServices; 

public ref class NPvDisplayWnd 
{ 
public : 
    NPvDisplayWnd(); 
    bool Handle(); 
    NPvResult^ ShowModeless(long locx, long locy, long x, long y); 
    NPvResult^ ShowModal(); 
    NPvResult^ NPvDisplayWnd::Create(); 
    int^ Display(NPvBuffer^ aBuffer, int^ x); 
    NPvResult^ Work(const std::string afilename, unsigned short asizex, unsigned short asizey, unsigned short aBPP, double aFPS); 
    NPvResult^ Close(); 
    NPvResult^ DoEvents(); 
} 

code.cpp:

#include "NPvDisplayWnd.h" 

NPvDisplayWnd::NPvDisplayWnd(){code} 
NPvResult^ NPvDisplayWnd::Create(){code} 
bool NPvDisplayWnd::Handle() 
NPvResult^ NPvDisplayWnd::ShowModeless(long locx, long locy, long x, long y){code} 
NPvResult^ NPvDisplayWnd::ShowModal(){code} 
int^ NPvDisplayWnd::Display(NPvBuffer^ aBuffer, int^ x){code} 
NPvResult^ NPvDisplayWnd::DoEvents(){code} 
NPvResult^ NPvDisplayWnd::Work(const std::string aFileName, unsigned short aSizeX, unsigned short aSizeY, unsigned short aBPP, double aFPS){code} 
NPvResult^ NPvDisplayWnd::Close(){code} 

我添加爲工作()函數的函數。如果我構建它並將其放置在我的C#代碼中,它會看到除工作以外的所有功能。爲了確保我使用的是正確的.dll,我將ShowModeless()的名稱更改爲ShowModeless__F()並重建它,並將其添加到我的C#中,並且更改結束,但我仍然沒有看到我的Work()函數。

+0

你有鏈接到你工作的例子嗎? – MusiGenesis

+0

這根本不是C++的dll;這是C++/CLI,它是與C++不同的語言(雖然類似)。 –

回答

0

在Windows上,您必須明確導出符號,以便用戶能夠通過DLL訪問它們。這是使用__declspec(export)語法完成的。在編譯和鏈接DLL期間這是需要的。


既然我們知道您使用的是C++/CLI而不是常規的C++,那麼我們可以看到一個問題。 Work需要std::string。但Work旨在成爲託管功能,託管代碼不能將std::string作爲參數。您需要改爲託管字符串類型。

+0

沒有我添加的功能,DLL正常工作。我甚至選擇了一個在.h和.cpp中重命名的函數,並將它提供給我的C#應用​​程序,並且它看到了更改。這個相同的函數只能在.h和.cpp中引用。我遵循相同的設置爲這個增加的功能,它沒有工作 – Grant

+0

@Grant:那麼很有可能你沒有加載你認爲你是的DLL。您需要確保在構建DLL後,它將進入路徑並覆蓋舊路徑,否則將覆蓋該路徑。如果這不是問題,那麼你將不得不向我們展示你的代碼。函數的C++ .h和.cpp代碼(可以工作,也可以不工作),以及用於加載它們的C#代碼。用代碼更新了 –

+0

。我只是在我的C#代碼中引用它並實例化DLL類 – Grant

0

本地C++類不能在C#中導入。您需要利用現有C++ DLL中的C++/CLI功能,以便受管客戶端(如C#)可以導入類。

namespace XX 
{ 
    public ref class YourClass{...}; 
} 

它將項下出口XX命名空間管理YourClass類。您需要使用/CLR編譯器標誌。

您可以將一組CPP文件編譯爲託管文件,並將其他文件集作爲非託管文件。託管類不能包含非託管內容(除非它是已聲明的指針)。

+0

更新了代碼 – Grant