2017-10-18 3 views
6

私はUbuntu OS上で実行されている
- .Net Core Applicationの2つのコンポーネントを持っています。
- C++共有ライブラリ(.soが)C++の(C#).NET Coreメソッド

今、私はC++コンポーネントがネットコアメソッドを呼び出すことができるようにしたい、いずれかのC++コンポーネントへのインタフェースを渡すと、パラメータとしてメソッドの実装や受け渡し方法をコールバックするために、このインターフェイスを使用します。これ〜C++コンポーネント。

私が達成しようとしています何

高レベルの例は:
C#のコンポーネント:

public interface IDevice 
{ 
    void OnDataAvailable(string data); 
} 

public class Device: IDevice 
{ 
    [DllImport("sampleCPPLibrary.so")] 
    private static extern int SetReceiver(IDevice receiver); 
    public void OnDataAvailable(string data) 
    { 
     Console.WriteLine(data); 
    } 
    public void Initialize() 
    { 
     SetReceiver(IDevice(this)) 
    } 
} 

C++コンポーネント:

extern "C" { 
void SetReceiver(IReceiver * receiver) 
{ 
    receiver->OnDataAvailable(10); 
} 
} 

は基本的に、私は何をしようとしていることがちょうど渡すことですC++コンポーネントへの何らかの "コールバック"を呼び出し、C++コンポーネントで何らかのイベントが発生したときにこの "コールバック"を呼び出します。

+0

私はあなたがインターフェイスでそれを行うことはできないと思っています(インターフェイスはそれを実装するオブジェクトを持っているためです)。私は.Net Coreにあまり慣れていませんが、['Marshal.GetDelegateForFunctionPointer'](https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getdelegateforfunctionpointer?view = netframework-4.7.1#System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointer_System_IntPtr_System_Type_)を利用できます。これを使用してCスタイルのコールバックを呼び出すことができます。 –

答えて

1

See this issueを参照してください。私はC#がCを呼び出してコールバック代理人になるコードを作成しました。したがって、CからはC#を呼び出し、追加のint型の引数を渡します。 See comments here from endurox projectと、動作例としてc-callback.tar.gzが添付されています。