Dot-Net

如何從非託管程式碼呼叫託管程式碼?

  • October 22, 2008

我想從非託管 C++ 呼叫我的 .NET 程式碼。我的程序入口點是基於 .NET 的,所以我不必擔心託管 CLR。我知道它可以使用 .NET 對象的 COM 包裝器來完成,但我想訪問託管類的各個靜態方法,所以 COM 不是我最短/最簡單的路線。

假設您正在談論真正的非託管程式碼 - 不僅僅是在使用 /clr 編譯的混合模式程序集中執行的本機 C++ - 最簡單的方法是在 C++/CLI 中為您的 .NET 程式碼創建一個包裝器。然後,您可以通過使用 __declspec(dllexport) 標記它們來導出 C++/CLI 方法。

或者,如果您可以控制非託管程式碼的呼叫,您可以將函式指針編組到您的 .NET 方法並將它們傳遞給非託管程式碼。

查看此解決方案: https ://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports 該解決方案允許通過使用 [DllExport] 屬性裝飾您的函式(與 P/Invoke DllImport 相對)從 C 呼叫 C# 函式.

範例:

C# 程式碼

class Test
{
    [DllExport("add", CallingConvention = CallingConvention.StdCall)]
    public static int Add(int left, int right)
    {
        return left + right;
    } 
}

C程式碼:

extern "C" int add(int, int);

int main()
{
     int z = add(5,10);
     printf("The solution is found!!! Z is %i",z);
     return 0;
}

輸出:

The solution is found!!! Z is 15

更新:評論中有一個問題和一個很好的答案:

如何在非託管項目中包含 dll?

您必須連結到編譯 C# 程式碼時生成的 .lib 文件(<https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396>)

引用自:https://stackoverflow.com/questions/225277