事實證明,當我的同事完成Qt端口時,他重新創建了一些Visual Studio項目文件,這導致它們對原始文件有不同的GUID。當我切換到Qt端口時,GUID與C#項目列爲依賴關係的內容不匹配。 Visual Studio在處理這個問題(或者告訴你)方面有點過分,所以你會得到上面列出的錯誤。
一旦我們解決這個問題,構建工作正常,但運行它並沒有做任何事情 - C++ DLL從來沒有響應過。最終我意識到,爲了Qt定時器和隊列的工作,我們不得不在DLL中調用QCoreApplication,因爲我們沒有使用Qt UI。但是,由於有一些Qt UI使用相同的DLL,所以如果UI已經調用了QApplication,我們不能總是調用QCoreApplication。您可以使用QCoreApplication :: instance()來檢查是否需要調用,但是您無法在DLL_PROCESS_ATTACH的DllMain()中執行此操作,因爲首先它太早,其次是Windows特定。所以我們想出了這個:
static struct Vars
{
QCoreApplication *l_pQt;
bool l_bQtCoreCreated;
Vars()
: l_pQt(NULL), l_bQtCoreCreated(false)
{
}
virtual ~Vars()
{
if (l_pQt != NULL)
{
if (l_bQtCoreCreated)
{
delete l_pQt;
}
l_pQt = NULL;
l_bQtCoreCreated = false;
}
}
} g_private;
static void InitQtCore(void)
{
if (g_private.l_pQt == NULL)
{
g_private.l_pQt = QCoreApplication::instance();
if (g_private.l_pQt == NULL)
{
g_private.l_bQtCoreCreated = true;
int argc = 0;
char *argv = NULL;
g_private.l_pQt = new QCoreApplication(argc, &argv);
}
}
}
在DLL中的任何功能不僅僅是基本設置在開始調用InitQtCore()。這適用於Qt和非Qt UI(C#和C++)。