Sdílet prostřednictvím


ActiveDir-Beispiel

Aktualisiert: November 2007

Dieses Beispiel demonstriert die standardmäßige Apartmenteinstellung eines nicht verwalteten Objekts, das Daten an eine nicht verwaltete Methode übergibt, welche die CoInitialize-Methode aufruft. Die CoInitialize-Methode initialisiert eine COM-Bibliothek in einem Singlethread-Apartment (STA). Standardmäßig werden C#-Clients in Multithread-Apartments (MTA) initialisiert. Visual Basic 2005-Clients werden als STA-Objekte initialisiert und müssen nicht angepasst werden.

Das ActiveDir-Beispiel verwendet die folgende nicht verwaltete Methode, die zusammen mit ihrer ursprünglichen Funktionsdeklaration aufgeführt wird:

  • DsBrowseForContainer aus Dsuiext.dll exportiert.

    int DsBrowseForContainer(PDSBROWSEINFO pInfo);
    

In C# erstellt das STAThreadAttribute-Attribut ein STA-Apartment. Da STA die standardmäßige Apartmenteinstellung für Visual Basic 2005-Clients ist, wird kein Attribut benötigt. Die Marshal.SizeOf-Methode errechnet dynamisch die Größe der nicht verwalteten Struktur.

Der Quellcode für die folgenden Codebeispiele wird im Technologiebeispiel für Plattformaufrufe in .NET Framework bereitgestellt.

Deklarieren von Prototypen

Public Class LibWrap
   ' Declares a managed prototype for the unmanaged function.
   Declare Unicode Function DsBrowseForContainerW Lib "dsuiext.dll" ( _
      ByRef info As DSBrowseInfo ) As Integer
   Public Shared DSBI_ENTIREDIRECTORY As Integer = &H90000
End Class 'LibWrap
public class LibWrap
{
   // Declares a managed prototype for the unmanaged function.
   [ DllImport( "dsuiext.dll", CharSet=CharSet.Unicode )]
   public static extern int DsBrowseForContainerW( ref DSBrowseInfo info );
   public const int DSBI_ENTIREDIRECTORY = 0x00090000;   
}

Aufrufen von Funktionen

Class App
   Public Shared MAX_PATH As Integer = 256
   ' The DsBrowseForContainerW method should be called from STA.
   ' STA is the default for Visual Basic 2005 clients, so no explicit
   ' setting is required as it is for C# clients.
   Public Shared Sub Main()
      ' Initializes all members.
      Dim dsbi As New DSBrowseInfo()
      
      Dim status As Integer = LibWrap.DsBrowseForContainerW( dsbi )
   End Sub 'Main
   
End Class 'App
class App
{
   public const int MAX_PATH = 256;
   // Must be marked as STA because the default is MTA. 
   // DsBrowseForContainerW calls CoInitialize, which initializes the 
   // COM library as STA.
   [ STAThread ]
   public static void Main()
   {
      // Initializes all members.
      …
      int status = LibWrap.DsBrowseForContainerW( ref dsbi );
   }
}

Siehe auch

Konzepte

Verschiedene Marshallingbeispiele

Datentypen für den Plattformaufruf

Erstellen von Prototypen in verwaltetem Code