我正在用C#和C ++调用DLL。目标是与硬件原型建立连接。如果我使用C ++调用DLL方法,则建立连接!但我出于各种原因使用C#调用该函数。
如何从同一方法获得两个不同的响应?唯一的区别是该方法从...中调用的编程语言。
我很感谢每个的建议!
以下是要调用的方法的定义:
extern "C" __declspec(dllexport) bool establishCon()
{
LL_Init();
return establishConnection();
}
通过以下方式在C ++中调用Method:
HMODULE dll = LoadLibrary(L"LL_Controll.dll");
if (dll != NULL)
{
establishCon est = (establishCon)GetProcAddress(dll, "establishCon");
if (est != NULL)
{
bool res = est();
if (res == true)
{
printf("Worked");
}
else
{
printf("Failed!");
}
}
else
{
printf("Problem!");
}
}
else
{
printf("CantLoadDLL");
}
C ++调用返回 true !
在C#中,方法按以下方式调用:
[DllImport(@"D:\C\2018-02-21\OccupancyTest01\x64\Debug\LL_Controll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern bool establishCon();
public bool call_LL_Controll_estabCon()
{
return establishCon();
}
在这种情况下,会返回 false 。
答案 0 :(得分:0)
我没有使用Windows开发工具进行测试,但您可以尝试以下操作吗?
[DllImport(@"D:\C\2018-02-21\OccupancyTest01\x64\Debug\LL_Controll.dll", CallingConvention=CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool establishCon();
对于C#-interop,布尔类型有点棘手。 YMMV,但在过去的项目中,为返回的类型添加一个明确的1字节编组指令对我来说很有用。
更多信息:https://blogs.msdn.microsoft.com/jaredpar/2008/10/14/pinvoke-and-bool-or-should-i-say-bool/
答案 1 :(得分:-2)
与.NET中的DLL交互时有3种基本情况: