2015-01-21 1 views
-1

C# 코드를 호출하는 C++ 코드를 작성하고 있습니다. C#은 C++ 코드에서 메소드를 다시 호출해야 할 수도 있습니다. 두 부분 모두 C#이라면 다음과 같은 메커니즘을 사용합니다. ShouldBCpp은 (&은 CsharpBase을 변경할 수 없음) 이 가리키는 내용을 알 수 없으므로 ShouldBCpp에서 ShouldBCpp에 등록하는 대신 ShouldBCpp에서 Csharp으로 EventHandler를 전달합니다.C++/CLI에서 C# 이벤트에 등록하십시오.

public abstract class CsharpBase 
{ 
    public abstract void SomeMethodDoingActionInB(); 
} 
public class Csharp : CsharpBase 
{ 
    public Csharp(EventHandler f) 
    { 
     MySpecialHook += f; 
    } 
    public event EventHandler MySpecialHook; 

    public override void SomeMethodDoingActionInB() 
    { 
     if (MySpecialHook != null) 
      MySpecialHook(this, null); 
    } 
} 

public class ShouldBCpp 
{ 
    public CsharpBase csharp; 
    public ShouldBCpp() 
    { 
     csharp = new Csharp(NotificationFromClassB); // actually using Activator::CreateInstance 
    } 
    public void NotificationFromClassB(object sender, EventArgs e) 
    { 
    } 
    public void Go() 
    { 
     csharp.SomeMethodDoingActionInB(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ShouldBCpp shouldBCpp = new ShouldBCpp(); 
     shouldBCpp.Go(); 
    } 
} 

질문은 C++/CLI에서 ShouldBCpp를 작성하는 방법입니다. delegate :

를 사용하기위한 보너스 포인트는

+1

당신이 자신을 도와 시도? 인기있는 디 컴파일러 중 일부는 원래 MSIL이 다른 언어에서 나온 경우에도 MSIL을 C++/CLI로 디 컴파일 할 수 있습니다. –

+0

[C++/CLI에서 C# 이벤트 연결] (http://stackoverflow.com/questions/19386508/hooking-a-c-sharp-event-from-c-cli) –

답변

1

C++/CLI에 대한 간단한 번역과 같을 것이다 감사합니다

public ref class IsCppCLI 
{ 
public: 
    CsharpBase^ csharp; 

    IsCppCLI() 
    { 
     csharp = gcnew Csharp(gcnew EventHandler(this, &IsCppCLI::NotificationFromClassB)); 

     // You didn't show your Activator code, 
     // but I believe it would translate to C++/CLI as this: 
     csharp = dynamic_cast<CsharpBase^>(
      Activator::CreateInstance(
       Csharp::typeid, 
       gcnew array<Object^> { 
        gcnew EventHandler(this, &IsCppCLI::NotificationFromClassB)})); 
    } 

    void NotificationFromClassB(Object^ sender, EventArgs^ e) 
    { 
    } 

    void Go() 
    { 
     csharp->SomeMethodDoingActionInB(); 
    } 
} 
관련 문제