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