Пример ActiveDir
Обновлен: Ноябрь 2007
В этом примере показан способ настройки параметра подразделения по умолчанию для управляемого объекта, передающего данные в неуправляемый метод, вызывающий метод CoInitialize. Метод CoInitialize инициализирует COM-библиотеку в однопотоковом подразделении. По умолчанию клиенты C# инициализируются в многопотоковых подразделениях. Клиенты Visual Basic 2005 инициализируются как объекты однопотокового подразделения и не требуют настройки.
В примере ActiveDir используется следующий неуправляемый метод, показанный с исходным объявлением функции.
Функция DsBrowseForContainer, экспортированная из Dsuiext.dll.
int DsBrowseForContainer(PDSBROWSEINFO pInfo);
В C# атрибут STAThreadAttribute создает однопотоковое подразделение. Так как однопотоковое подразделение является подразделением по умолчанию для клиентов Visual Basic 2005, никакой атрибут не требуется. Метод Marshal.SizeOf динамически вычисляет размер неуправляемой структуры.
Исходный код для следующих примеров кода см. в Пример технологии вызова неуправляемого кода для .NET Framework.
Объявление прототипов
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;
}
Вызов функций
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 );
}
}