2012-06-21 68 views
2

我正在使用第三方專有DLL,但未提供源代碼。但是,似乎已經使用SWIG 1.3.39自動生成的包裝代碼對我來說是可用的。包裝器代碼由一個C++文件組成,該文件可以將DLL編譯成DLL(使用一些描述DLL的頭文件)以及一個使PInvoke調用C++包裝器DLL的C#項目。如何調試解決方案中包含的未經管理的C++代碼

那些C++項目,我已經包含在我的項目解決方案中,但是當我在C++代碼中設置斷點時,我永遠不會到達那裏。當我嘗試在C#中使用F11時,爲了進入C++函數,我得到了「Show Assembly」。

我有trie 解決方案>配置>配置proporties,但沒有找到任何選項來調試非託管/本機代碼。

編輯

包裝器的C++代碼是提供給我,我要見我從C#傳遞實際上是獲得通過的C#代碼的值。

// In one file of the C# wrapper: 
public string GetKey() 
{ 
    // swigCPtr is a HandleRef to an object already created 
    string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr); 
    return ret; 
} 

// In the csWrapperPINVOKE class in another file in the C# wrapper: 
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")] 
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1); 

和來自C++包裝的C++代碼。

SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) { 
    char * jresult ; 
    mdMUHybrid *arg1 = (mdMUHybrid *) 0 ; 
    char *result = 0 ; 

    arg1 = (mdMUHybrid *)jarg1; 
    result = (char *)(arg1)->GetKey(); 
    jresult = SWIG_csharp_string_callback((const char *)result); 
    return jresult; 
} 

現在由於我嘗試使用csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);

現在我想看看是否jarg1正從swigCPtr的值傳遞從C#包裝swigCPtr;

SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) { 
    char * jresult ; 
    mdMUHybrid *arg1 = (mdMUHybrid *) 0 ; 
    char *result = 0 ; 

    arg1 = (mdMUHybrid *)jarg1; 
    result = (char *)(arg1)->GetKey(); 
    jresult = SWIG_csharp_string_callback((const char *)result); 
    return jresult; 
} 
+0

如果您沒有源代碼,那麼在調試本機代碼時沒有多少意義。沒什麼可看的,但機器代碼,沒有什麼可以解決任何問題。聯繫供應商尋求支持。 –

+0

@HansPassant,我有我的C++包裝代碼,我希望看到從C#傳遞的值實際上反映在包裝函數中。更新了代碼以供參考 – Simsons

回答

0

當你有一個託管的exe文件並且想要調試它使用的本地DLL時,你需要告訴調試器。不要使用調試器類型自動,默認設置是什麼。使用混合 instaed。

自動識別託管的exe文件並允許進行託管調試。這不是您需要調試本機C++代碼的問題。

你找到調試器類型設置調試部分項目屬性。

相關問題