Ejemplo ActiveDir
Actualización: noviembre 2007
En este ejemplo se muestra cómo ajustar la configuración de apartamento predeterminada de un objeto que pasa datos a un método no administrado que llama al método CoInitialize. El método CoInitialize inicializa una biblioteca COM en un STA (Single-Threaded Apartment, apartamento de subproceso único). De manera predeterminada, los clientes C# se inicializan en apartamentos multiproceso (MTA). Los clientes Visual Basic 2005 se inicializan como objetos STA y no es necesario ajustarlos.
En el ejemplo ActiveDir se utiliza el siguiente método no administrado, que se muestra con su declaración de función original:
DsBrowseForContainer exportado desde Dsuiext.dll.
int DsBrowseForContainer(PDSBROWSEINFO pInfo);
En C#, el atributo STAThreadAttribute crea un apartamento STA. Como STA es la configuración de apartamento predeterminada para los clientes Visual Basic 2005, no es necesario ningún atributo. El método Marshal.SizeOf calcula dinámicamente el tamaño de la estructura no administrada.
El código fuente de los ejemplos de código siguientes lo proporciona el Ejemplo de tecnología de invocación de plataformas de .NET Framework.
Declaración de prototipos
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;
}
Llamadas a funciones
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 );
}
}
Vea también
Conceptos
Diversos ejemplos de cálculo de referencias