Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 );
}
}