C#vs C ++ DLL调用

时间:2018-04-05 13:22:54

标签: c# c++ dll

我正在用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

2 个答案:

答案 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种基本情况:

  1. 这是一个.NET DLL。因此它被编程为.NET的IL格式。这是最简单的情况:您添加项目引用。 Intellisense和Autocomplete将获得所有公共名称空间和类型,就像它们已经为每个其他引用DLL所做的那样。而且,.NET exe可以用作DLL。内部格式非常相似,除了一些本机Bootstrapping代码和一个告诉Runtime“wich类具有主要功能”的清单,它与.NET DLL大致相同
  2. 这是一个COM enabeled DLL。 COM(https://en.wikipedia.org/wiki/Component_Object_Model)在几个方面是.NET的前身,因此两种方式都有很强的互操作性(https://en.wikipedia.org/wiki/COM_Interop)。 .NET可以相对容易地使用COM dll。并且.NET DLL公开了使用它们所需的一切,如COM。
  3. 最终的后备是P / Invoke。这就是您在处理任何本机代码时使用的内容,例如一些古老的Windows API函数或本机代码。