2012-08-01 62 views
2

我想導入一個DLL到一個C#控制檯應用程序只是爲了看看我能否得到一個DLL作爲一個想要工作,當試圖這個和導出與C函數代碼一切工作正常,功能可以導入我的C#應用​​程序。導入非託管的「QT」DLL到C#給dllNotFoundException但存在

當我嘗試在我的非託管dll中爲某些QT方法添加某種鏈接時,問題就開始了。我正在使用DllImport從dll導入函數。

[DllImport("cDLL.dll", EntryPoint = "[email protected]")] 
static extern double Add(double a, double b); 

1 - 這是怎樣的非託管的DLL(不看代碼的功能,這只是用於測試)看起來,當它工作正常等。

的main.cpp工作

#include <stdexcept> 
#include "Windows.h" 

using namespace std; 

extern "C" __declspec(dllexport) double __stdcall Add(double a, double b) 
{ 
    return a + b; 
} 
extern "C" __declspec(dllexport) const char* getText() 
{ 
    return "hello world";//returnBufferString.c_str(); 
} 
BOOL __stdcall DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) { 
    return TRUE; 
} 

2 - 當我嘗試添加幫助功能有一些QT碼,只是一個普通的QString的開始的DllImport扔dllNotFoundException.dumpbin.exe顯示所有導出的函數,以及包括Qt代碼...

的main.cpp dllNotFoundException

#include <QString> 
using namespace std; 
class testa 
{ 
public: 
    static char* test() 
    { 
     QString a = "hejsan"; 
     return qString2Char(a); 
    } 
    static char* qString2Char(QString a) 
    { 
     return a.toUtf8().data(); 
    } 
}; 

這是從像這樣的getText()函數調用後:第二部分:

string returnBufferString; 
extern "C" __declspec(dllexport) const char* getText() 
{ 
    returnBufferString = testa::test(); 
    return returnBufferString.c_str(); 
} 

當我嘗試從的DllImport的dll我在2獲得dllNotFoundException。我該如何解決這個問題?我錯過了任何依賴或任何東西。我的DLL是建立使用msvc2010編譯器和.pro文件看起來是這樣的:

cDLL.pro

TEMPLATE = lib 
CONFIG += dll 

QT += core 

# Input 
SOURCES += main.cpp 

我卡住了...

回答

2

它不會告訴你到底是什麼DLL無法找到。這幾乎肯定不是你的 DLL,它是QT需要的DLL之一。你也必須將它們複製到EXE文件夾中。如果您不知道並且無法在諾基亞文檔中找到它,那麼您可以使用SysInternals的ProcMon實用程序找到它。

但是,在這種情況下,您肯定希望將QT鏈接到您的DLL,因爲這些DLL可以共享的機率很小。使用此SO question指導您設置您的QT項目。

+0

就像我很愚蠢,謝謝澄清! – 2012-08-03 12:38:46