将非托管“QT”dll导入C#,给出dllNotFoundException但存在

时间:2012-08-01 13:53:20

标签: c++ qt dll dllimport

我正在尝试将一个dll导入到C#控制台应用程序,只是为了看看我是否可以将dll作为一个需要工作,在尝试这个时,使用C代码导出函数一切正常并且可以导入函数我的C#应用​​程序。

当我尝试在我的非托管dll中为某些QT方法添加某种链接时,问题就开始了。我正在使用DllImport从dll导入函数。

[DllImport("cDLL.dll", EntryPoint = "_Add@16")]
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:nd部分得到dllNotFoundException。我该如何解决这个问题?我错过了任何依赖或任何东西。我的dll是使用msvc2010编译器构建的.pro文件如下所示:

cDLL.pro

TEMPLATE = lib
 CONFIG  += dll

QT += core

 # Input
 SOURCES += main.cpp

我被困了......

2 个答案:

答案 0 :(得分:2)

它没有准确地告诉您它无法找到的 DLL。这几乎肯定不是你的 DLL,它是QT所需的DLL之一。您还必须将它们复制到EXE文件夹中。如果您不知道并且无法在诺基亚文档中找到它,那么您可以使用SysInternals的ProcMon实用程序找到它。

但是,在这种情况下,您肯定希望将QT链接到您的DLL,因为这些DLL可以共享的几率很小。使用此SO question作为设置QT项目的指导。

答案 1 :(得分:0)

您需要将DLL放在与可执行文件相同的文件夹中。

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx