Share via


ActiveDir, exemple

Mise à jour : novembre 2007

Cet exemple démontre comment régler le paramètre du thread cloisonné par défaut d'un objet managé qui passe des données à une méthode non managée qui appelle la méthode CoInitialize. La méthode CoInitialize initialise une bibliothèque COM dans un thread cloisonné (STA, Single-Threaded Apartment). Par défaut, les clients C# sont initialisés dans des multithreads cloisonnés (MTA, Multithreaded Apartment). Les clients Visual Basic 2005 sont initialisés en tant qu'objets STA et il est inutile de les ajuster.

L'exemple ActiveDir utilise la fonction non managée suivante, illustrée avec sa déclaration de fonction d'origine :

  • DsBrowseForContainer exportée à partir de Dsuiext.dll

    int DsBrowseForContainer(PDSBROWSEINFO pInfo);
    

En C#, l'attribut STAThreadAttribute crée un thread cloisonné STA. Comme STA est le paramètre de cloisonnement par défaut pour les clients Visual Basic 2005, aucun attribut n'est requis. La méthode Marshal.SizeOf calcule dynamiquement la taille de la structure non managée.

Le code source pour les exemples de code suivants est fourni par Appel de plate-forme, exemple de technologie du .NET Framework.

Déclaration de prototypes

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;   
}

Appel de fonctions

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 );
   }
}

Voir aussi

Concepts

Exemples divers de marshaling

Types de données d'appel de plate-forme

Création de prototypes dans du code managé