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 );
   }
}

请参见

概念

其他封送处理示例

平台调用数据类型

在托管代码中创建原型