Esempio di ActiveDir

Aggiornamento: novembre 2007

In questo esempio viene dimostrato come regolare l'impostazione di apartment predefinita di un oggetto gestito mediante il passaggio di dati a un metodo non gestito che chiama il metodo CoInitialize. Il metodo CoInitialize inizializza una libreria COM in un apartment a thread singolo (STA). Per impostazione predefinita, i client C# vengono inizializzati in apartment con multithreading (MTA). I client Visual Basic 2005 vengono inizializzati come oggetti STA e non richiedono alcuna modifica.

Nell'esempio di ActiveDir viene utilizzato il seguente metodo non gestito, illustrato con la dichiarazione di funzione originale:

  • DsBrowseForContainer esportato da Dsuiext.dll.

    int DsBrowseForContainer(PDSBROWSEINFO pInfo);
    

In C# l'attributo STAThreadAttribute crea un apartment STA. Poiché STA rappresenta l'impostazione degli apartment predefinita per i client Visual Basic 2005, non è richiesto alcun attributo. Il metodo Marshal.SizeOf consente di calcolare in modo dinamico le dimensioni della struttura non gestita.

Il codice sorgente per gli esempi di codice riportati di seguito è fornito dall'Esempio di tecnologia di richiamo piattaforma di .NET Framework.

Dichiarazione dei prototipi

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

Chiamata delle funzioni

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

Vedere anche

Concetti

Esempi vari di marshalling

Tipi di dati del richiamo piattaforma

Creazione di prototipi nel codice gestito