2011-11-20 41 views
3

我有了這個在其H文件中的DLL:後期綁定C++ DLL到C# - 功能總是返回true

extern "C" __declspec(dllexport) bool Connect(); 

,並在C文件:

extern "C" __declspec(dllexport) bool Connect() 
{ 
    return false; 
} 

在C#中,我有以下代碼:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate bool ConnectDelegate(); 

private ConnectDelegate DLLConnect; 

public bool Connect() 
{ 
    bool l_bResult = DLLConnect(); 
    return l_bResult; 
} 

public bool LoadPlugin(string a_sFilename) 
{ 
    string l_sDLLPath = AppDomain.CurrentDomain.BaseDirectory; 

    m_pDLLHandle = LoadLibrary(a_sFilename); 
    DLLConnect = (ConnectDelegate)GetDelegate("Connect", typeof(ConnectDelegate)); 
    return false; 
} 

private Delegate GetDelegate(string a_sProcName, Type a_oDelegateType) 
{ 
    IntPtr l_ProcAddress = GetProcAddress(m_pDLLHandle, a_sProcName); 
    if (l_ProcAddress == IntPtr.Zero) 
     throw new EntryPointNotFoundException("Function: " + a_sProcName); 

    return Marshal.GetDelegateForFunctionPointer(l_ProcAddress, a_oDelegateType); 
} 

由於某種奇怪的原因,無論C++中的返回值是什麼,connect函數總是返回true。 我試過在C#中將調用約定更改爲StdCall,但問題仍然存在。

任何想法?

回答

4

這個問題顯然是在「布爾」。 在MSVC sizeof(布爾)是1,而sizeof(布爾)是4! BOOL是由windows API用來表示布爾值的類型,並且是一個32位整數。 所以C#發揮了32位的價值,但你是一個1字節的價值,所以你變得「垃圾」。

解決辦法有兩個:

1)U改變你的C代碼返回BOOL或INT。

2)您更改C#代碼添加[return:MarshalAs(UnmanagedType.I1)]屬性到您的dll導入功能。

+0

這樣做。謝謝! – Nitay