如何在.NET中使用MSAdminBase COM对象?

时间:2011-07-14 08:30:58

标签: .net com

此对象在%windir%\ system32 \ ADMWPROX.DLL 中实现 - 请参阅HKEY_CLASSES_ROOT\CLSID\{70B51430-B6CA-11D0-B9B9-00A0C922E750}

它完全可以从C代码中使用,但是我希望用.NET代码替换它,而对于tlbimp来说,ADMWPROX.DLL似乎不是一个有效的类型库:

z:\Work>tlbimp c:\Windows\system32\admwprox.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 4.0.30319.1
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : error TI1002 : The input file 'c:\Windows\system32\admwprox.dll' is not a valid type library.

z:\Work>

当然,在Visual Studio中添加COM引用时,COM对象列表中缺少它。

PS:我正在尝试设置IIS://localhost/W3SVC/1!SslCertHash属性,而this article解释说,唯一的方法是通过MSAdminBase对象,而不是MSAdminObject(到期)到架构定义中的错误)。后者方便地被.NET System.DirectoryServices.DirectoryEntry包裹,但前者不是 - 因此是我的痛苦。

1 个答案:

答案 0 :(得分:1)

好的,我就是这样做的:

  1. 将IMSAdminBase_W接口定义转换为IDL。该接口在Microsoft SDK中的iadmw.h中声明。它包含注释中的所有IDL属性,因此转换很容易。当然,IDL也需要声明coclass和库。
  2. 然后我用midl编译了IDL文件。
  3. 接下来,我在生成的tlb文件上运行了tlbimp。
  4. 最后,必须修复生成的interop dll,特别是TlbImp将结构归结为StructLayout.Pack = 4,如果.NET以64位运行,这将使我们失败 - 请参阅Access Violation inside inetinfo.exe when passing byte array through IMSAdminBase from a .NET app compiled to AnyCPU。我用Reflector.NET反编译它。事实上,我只是将反编译的互操作源作为我项目的一部分。
  5. 就是这样。

    我没有创建互操作源代码作为第一步也是唯一一步,因为IMSAdminBase_W接口非常大,所以我更喜欢将其转换为IDL,这更容易。