2017-10-04 1 views
0

Ich schreibe einen CoreCLR-Host in C++.Dokumentation über das Schreiben eines CoreCLR-Hosts in C++

I'have erfolgreich aC# Funktion aus einer C++ genannt: https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting

Lesen, dass die Dokumentation:

Eine weitere Option, wenn ExecuteAssembly nicht Ihren Host-Anforderungen gerecht zu werden, ist zu CreateDelegate verwenden Erstellen eines Funktionszeigers auf eine statische verwaltete Methode . Dies erfordert, dass der Host die Signatur der Methode kennt, die er aufruft (um den Funktionszeigertyp zu erstellen), aber ermöglicht Hosts die Flexibilität, anderen Code als den Einstiegspunkt einer Assembly aufzurufen.

aC# Funktion gegeben, wie kann ich so

zum Beispiel für eine Funktion "den C++ Funktion Zeigertyp erstellen":

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

gibt es einige Serialisieren/Deserialisieren Regeln, wie verhalte ich mich mit Objekten oder Arrays als Parameter?

Gibt es eine vernünftige Dokumentation für das Einbetten von CoreClr in C++ - Code?

Ich suche so etwas wie dieses (aber für CoreCLR): http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

Antwort

1

Ich denke, die Dokumentation den Code enthält, die Sie benötigen.

Ich habe eine Klasse in einer Dotnet-Core-DLL erstellt und in der Lage, sie von cpp wie folgt aufzurufen.

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); 

Format des Delegierten

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

Core-Klasse

using System; 
namespace SampleAppCore 
{ 

    public static class Start{ 

     public static void Run(string input){ 

      Console.WriteLine(input); 
     } 

    } 
} 
+0

BSTR für eine Zeichenfolge, SAFEARRAY * für einen String []. –

+0

Dieses Beispiel verwendet char *, warum @HansPassant sagt BSTR? Gibt es ein paar Dokumente darüber oder muss ich die Beispiele rekonstruieren, um das zu verstehen? – Albertino80

Verwandte Themen