2017-10-04 6 views
0

私はCoreCLRホストをC++で作成しています。C++でのCoreCLRホストの作成に関するドキュメント

I'haveは正常のC++からのAC#関数と呼ば:そのドキュメントを読ん https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting

別のオプション、ExecuteAssemblyはあなたのホストのニーズを満たしていない場合は、CreateDelegateを使用する です静的に管理された メソッドへの関数ポインタを作成します。これにより、ホストは(ファンクションポインタタイプを作成するために) が呼び出すメソッドのシグネチャを知る必要がありますが、 は、ホストがアセンブリの エントリポイント以外のコードを柔軟に呼び出すことを可能にします。

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

は、いくつかのマーシャリング/アンマーシャリングのルールがどのように、そこにある:どのように私はこのような機能のために、例えば

を "C++関数ポインタ型を作成する" ことができ、AC#関数を与え

オブジェクトや配列をパラメータとして扱うのですか?

C++コードにcoreclrを埋め込むための適切な文書がありますか?

は、私はこのような何か(ただし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); 

私はドットネットコア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

関連する問題