ActiveDir 示例
更新:2007 年 11 月
该示例演示如何调整向调用 CoInitialize 方法的非托管方法传递数据的托管对象的默认单元设置。CoInitialize 方法在单线程单元 (STA) 中初始化 COM 库。默认情况下,C# 客户端在多线程单元 (MTA) 中初始化。Visual Basic 2005 客户端被初始化为 STA 对象,并且不需要进行调整。
ActiveDir 示例使用以下非托管方法(这里同时显示其原始函数声明):
从 Dsuiext.dll 导出的 DsBrowseForContainer。
int DsBrowseForContainer(PDSBROWSEINFO pInfo);
在 C# 中,STAThreadAttribute 属性创建 STA 单元。由于 STA 是 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 );
}
}