2013-07-30 121 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 
}