2017-10-04 54 views
0

我正在用C++編寫CoreCLR主機。有關在C++中編寫CoreCLR主機的文檔

從C++

I'have成功地稱爲AC#功能: https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting

讀取文檔:

另一種選擇,如果ExecuteAssembly不能滿足主機的需求,是 使用createDelegate方法創建一個指向靜態管理的方法的函數指針。這要求主機知道它調用的方法(爲了創建函數指針類型)的簽名,但 允許主機靈活地調用除程序集的入口點以外的代碼。

給AC#功能哪能 「創建C++函數指針」

例如,像這樣的功能:

public static int withParams(int aNumber, string[] args) 

是有一些封送處理/拆封規則,如何我的行爲與對象或數組作爲參數?

是否有一個體面的官方文檔嵌入coreclr在c + +代碼?

我期待這樣的事情(但coreclr): http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

回答

1

我覺得文檔包含你所需要的代碼。

void *pfnDelegate = NULL; 
hr = runtimeHost->CreateDelegate(
    domainId, 
    L"HW, Version=1.0.0.0, Culture=neutral", // Target managed assembly 
    L"ConsoleApplication.Program",   // Target managed type 
    L"Main",         // Target entry point (static method) 
    (INT_PTR*)&pfnDelegate); 

((MainMethodFp*)pfnDelegate)(NULL); 

我在dotnet核心dll中創建了一個類,並且可以從cpp調用它,如下所示。

void *pfnDelegate = NULL; 
hr = runtimeHost->CreateDelegate(
    domainId, 
    L"SampleAppCore", // Target managed assembly 
    L"SampleAppCore.Start", // Target managed type 
    L"Run",     // Target entry point (static method) 
    (INT_PTR*)&pfnDelegate); 
if (FAILED(hr)) 
{ 
    printf("ERROR - Failed to execute %s.\nError code:%x\n", targetApp, hr); 
    return -1; 
} 


char* hello = "hello "; 

((MainMethodFp*)pfnDelegate)(hello); 

格式委託的

typedef void (STDMETHODCALLTYPE MainMethodFp)(char* args); 

核心類

using System; 
namespace SampleAppCore 
{ 

    public static class Start{ 

     public static void Run(string input){ 

      Console.WriteLine(input); 
     } 

    } 
} 
+0

BSTR的字符串,SAFEARRAY *爲一個字符串[]。 –

+0

此示例使用char *,爲什麼@HansPassant說BSTR?是否有一些關於它的文檔,或者我必須對樣本進行逆向工程才能理解? – Albertino80