2013-07-30 124 views
0

這是一個類庫clr/C++項目。 A類是非託管C++,B類託管C++。 我想從C#應用程序中創建一個B對象,並使用該對象調用「void Sign」並在C#中捕獲StatusEvent。 如何從A :: call_A中調用B :: Showrs以實現此目的?請記住,call_A是從B類對象的委託中調用的。 提前謝謝!從非託管類對象調用託管類函數

public class A{ 
     public: 
      int call_A(); 
    }; 
    public ref class B{ 
     private: 
      A* a1; 
    public: 
     void Sign(String^ ufile); 
     void Showsts(string sts); 
     delegate void GetResult(String^); 
     event GetResult^ StatusEvent; 
     SpyrusLib(void){ 
      a1=new A(); 
     } 
    protected: ~SpyrusLib(){ 
      delete a1; 
     } 
    private: 
     String^ str; 
     delegate int MySignDelegate(String^); 
     int MySign(String^ file); 
     void Callbacksign(IAsyncResult ^ar);  
    }; 
    void B::Sign(String^ ufile){ 
     MySignDelegate^ signDel = gcnew MySignDelegate(this, &B::MySign); 
     AsyncCallback^ cb = gcnew AsyncCallback(this, &B::Callbacksign); 
     signDel->BeginInvoke( ufile , cb, signDel); 
    } 
    int B::MySign(String^ file){ 
     stdstr=msclr::interop::marshal_as<std::string>(file); 
     a1->call_A(stdstr); 
    } 
    void B::Showsts(string sts){ 
      str = gcnew String(sts.c_str()); 
      StatusEvent(str); 
    } 
    int A::call_A(string stat){ 
      ?-Showsts(stat); 
    } 

回答

0

我不知道這是最好的解決辦法,但我解決它加入以下的事情類:

typedef void (__stdcall * Unmanagedstatus)(string sts); 
using namespace std; 

public class A{ 
    private: 
     Unmanagedstatus sendmsg; 
    public: 
     int call_A(); 
     spyrus(Unmanagedstatus unm) 
     { 
      sendmsg=unm; 
     } 
}; 
public ref class B 
{ 
    private: 
     delegate void Managedstatus(string); 
     Managedstatus^ managed; 
     IntPtr unmanaged; 
     A* a1; 
    public: 
     SpyrusLib(void) 
     { 
      managed = gcnew Managedstatus(this, &B::Showsts); 
      unmanaged = Marshal::GetFunctionPointerForDelegate(managed); 
      a1=new A((Unmanagedstatus)(void*)unmanaged); 
     } 
} 
int A::call_A(string stat){ 
    sendmsg(stat); // this will call B::Showsts and the events raised 
      //from Showsts are also working in the C# app 
}