延迟绑定c++ DLL到c# -函数总是返回true

本文关键字:函数 返回 true 绑定 c++ DLL 延迟 | 更新日期: 2023-09-27 18:15:25

我有一个DLL,在它的h文件中有这个:

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,但问题仍然存在。

任何想法?

延迟绑定c++ DLL到c# -函数总是返回true

问题可能出在"bool"上。在MSVC中,sizeof(bool)为1,而sizeof(bool)为4!BOOL是windows API用来表示布尔值的类型,是一个32位整数。所以c#期望一个32位的值,但你提供了一个1字节的值,所以你得到了"垃圾"。

有两个解决方案:

1)你改变你的C代码返回BOOL或int.

你修改c#代码,将[return:MarshalAs(UnmanagedType.I1)]属性添加到你的dll导入函数中。