2013-07-30 4 views
0

이 클래스 라이브러리 clr/C++ 프로젝트입니다. 클래스 A는 관리되지 않는 C++ 클래스 B managed C++입니다. C# 응용 프로그램에서 B의 객체를 만들고 해당 객체로 "void Sign"을 호출하고 C#의 StatusEvent를 catch하고 싶습니다. B :: Showsts를 A :: call_A에서 호출하려면 어떻게합니까? 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 
} 
관련 문제