2013-06-25 47 views
0

,當我得到這個異常:未處理的異常調用我的CLR項目

在0x75374B32(KernelBase.dll)在 LogLoaderUnmanaged.exe

未處理的異常:0xE0434352(參數:0x80070002, 00000000,00000000 ,0x00000000,0x74040000)。

當我打電話使用此代碼我的CLR項目(一個應用程序.exe類型的項目的一部分):

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    _tprintf_s(_T("Press enter to start logging messages.")); 
    _getch(); 
    std::string app("Application"); 
    std::string domain("Domain"); 
    std::string message("Message"); 
    UnmanagedLoggerClient::LogError(Debug, app.c_str(), domain.c_str(), message.c_str()); 
    _tprintf_s(_T("Done.")); 
} 

的錯誤是在調用LOGERROR,這是在我的CLR DLL的報頭定義如下:

#ifdef UNMANAGEDLOGGERCLIENT_EXPORTS 
#define WIN32PROJECT_API __declspec(dllexport) 
#else 
#define WIN32PROJECT_API __declspec(dllimport) 
#endif 

enum UnmanagedLogLevel 
{ 
    Debug = 0, 
    Error = 1 
}; 

static class WIN32PROJECT_API UnmanagedLoggerClient 
{ 
public: 
    static void LogError (UnmanagedLogLevel level, const char* app, const char* domain, const char* message); 
}; 

在該實施方式的方法是非常簡單的:

void UnmanagedLoggerClient::LogError(UnmanagedLogLevel level, const char* app, const char* domain, const char* message) 
{ 
    LoggerClient::LogLevel logLevel = static_cast<LoggerClient::LogLevel>(level); 
    LoggerClient::Logger::LogError(logLevel, gcnew String(app), gcnew String(domain), gcnew String(message), DateTime::Now); 
} 

任何想法爲什麼發生這種情況?我不是一個真正的C++傢伙,我還沒有找到任何有用的信息在網上搜索這個問題。非常感謝您的任何意見!

+0

@HansPassant - 你是英雄。我感到非常愚蠢,不檢查0x80070002代表什麼。這正是它不工作的原因。輸出目錄與所有依賴關係所在的二進制目錄不同。請將您的答案作爲解決方案發布,以便我可以將其設置爲正確的答案! – Alexandru

回答

4

您正在使用非常脆弱的方式來初始化CLR,因此診斷很差。在異常診斷中可以看到「文件未找到」錯誤代碼,錯誤代碼爲0x80070002。

您設法啓動CLR,異常代碼是託管異常,但找不到文件。確保所有可執行文件與EXE位於同一目錄中。使用SysInternals的ProcMon如果沒有幫助,你會看到它搜索一個文件,但沒有找到它。