簡體   English   中英

C#與C ++ DLL調用

[英]C# vs C++ DLL call

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

我沒有可用於測試的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#互操作而言有些棘手。 YMMV,但是在過去的項目中,為返回的類型添加一個顯式的1字節編組指令對我來說確實有用。

更多信息: https : //blogs.msdn.microsoft.com/jaredpar/2008/10/14/pinvoke-and-bool-or-should-i-say-bool/

與.NET的DLL進行交互時,有3種基本情況:

  1. 這是一個.NET DLL。 因此,它被編程為.NET的IL格式。 這是最簡單的情況:添加項目引用。 Intellisense和Autocomplete將獲得所有公共命名空間和類型,就像它們對其他每個參考DLL所做的一樣。 此外,.NET exe可以用作DLL。 內部格式非常相似,除了一些本地的Bootstrapping代碼和一個清單,該清單告訴運行時“ wich類具有主要功能”,它與.NET DLL幾乎相同。
  2. 它是一個COM命名的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 /調用。 這就是您必須處理任何本機代碼(例如某些古老的Windows API函數或本機代碼)時使用的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM