Dot-Net
如何從非託管程式碼呼叫託管程式碼?
我想從非託管 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>)