我有一个在其h文件中包含此文件的DLL:
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,但问题仍然存在.
有任何想法吗?
解决方法:
问题可能出在“布尔”中.
在MSVC中,sizeof(bool)为1,而sizeof(BOOL)为4!
BOOL是Windows API用于表示布尔值的类型,并且是32位整数.
因此,C#使用32位值,但是u占用1个字节的值,因此u获得“垃圾”.
有两种解决方案:
1)u更改您的C代码以返回BOOL或int.
2)您更改C#代码,将[return:MarshalAs(UnmanagedType.I1)]属性添加到dll导入函数.