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