2017-10-18 8 views
6

J'ai 2 composants:
- Application .Net Core fonctionnant sous Ubuntu OS.
- C++ bibliothèque partagée (.so)Call (C#) Méthode .NET Core à partir de C++

Maintenant, je veux composant C++ pour pouvoir appeler la méthode .Net de base, soit l'interface passe au composant C++ qui utilisera cette interface pour la mise en oeuvre de la méthode ou méthode de rappel qui passe comme paramètre au composant C++.

exemple de haut niveau ce que je suis en train de réaliser:
composant 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)) 
    } 
} 

composant C++:

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

Fondamentalement, ce que je suis en train de faire est juste pour passer une sorte de "callback" au composant C++ et appelle ce "callback" quand un événement se produit dans un composant C++.

+0

Je doute que vous pouvez le faire avec l'interface (parce que l'interface signifie avoir un objet qui l'implémente). Je ne suis pas beaucoup dans .Net Core, mais vérifiez si ['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_) est disponible. Vous pouvez essayer de l'utiliser pour appeler le rappel de style C. –

Répondre

1

Voir See this issue à partir de commentaires J'ai construit du code où C# appelle C et lui donne un délégué de rappel. Ainsi, à partir de C, il appelle C# et passe un argument de type int supplémentaire. See comments here from endurox project, et attaché c-callback.tar.gz pour l'exemple de travail.