Thunk

Als Thunk bezeichnet man im Jargon der Softwareentwicklung den Aufruf von Code, der einer anderen Plattform oder einem anderen Framework angehört. Bei der Umstellung von 16 auf 32 Bit beispielsweise konnten die Betriebssysteme (OS/2, Windows NT etc.) 16-Bit-Code durch entsprechendes Umsetzen der Aufrufparameter und Adressen realisieren, so dass 16-Bit-Programme weiter verwendet werden konnten. In der modernen Softwareentwicklung ist ein Thunk z. B. der Aufruf von nativem Code aus Managed Code heraus und umgekehrt (siehe Java Native Access oder .Net-Frameworks P/Invoke). Es handelt sich also um einen Plattform-Übergang (Transition), bei dem die Aufrufkonventionen und/oder Übergabeparameter entsprechend umgesetzt werden müssen (Marshalling). Die Programmiersprache C++/CLI aus dem .NET-Framework von Microsoft wurde eigens dazu konzipiert, solche Thunks in beide Richtungen zu ermöglichen:

Managed-Unmanaged Aufruf

Gegeben sei eine native C++ Klasse, z. B. in einem C++ Projekt oder als Bestandteil eines C++/CLI Projekts, die nachfolgend von managed code verwendet wird:

public class CNativeClass
{
  private:
    int m_i;
  public:
    void SetValue( int i )
    {
      m_i = i;
    }
};

Managed C++/CLI Klasse (die in dieser Form von beispielsweise C# direkt instanziert werden kann), welche die zuvor gezeigte native Klasse verwendet:

public ref class CManagedClass
{
  public:
    CManagedClass()
    {
      System::Int32 i = 42;
      CNativeClass* pNativeClass = new CNativeClass();
      pNativeClass->SetValue( i );//Umsetzung des Datentyps
      delete pNativeClass;
    }
};

Unmanaged-Managed Aufruf

Managed C++/CLI Klasse:

public ref class CManagedClass
{
  private:
    System::Int32 m_i;
  public:
    void SetValue( int i )
    {
      m_i = i;//Umsetzung des Datentyps
    }
};

Native C++ Klasse in einem C++/CLI Projekt. Hier ist zu sehen, dass auch der umgekehrte Weg möglich ist, nämlich das Instanzieren von managed code innerhalb einer unmanaged Klasse. Bedingung ist jedoch, dass es sich um ein C++/CLI Projekt handelt, so dass der Compiler die entsprechende Syntax versteht. Der Thunk tritt bereits bei der gcnew Anweisung auf, da hier der Konstruktor der managed Klasse aufgerufen wird:

public class CNativeClass
{
  public:
    void Foo()
    {
      int i = 42;
      CManagedClass^ pManagedClass = gcnew CManagedClass();
      pManagedClass->SetValue( i );
    }
};

Literatur

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.