【问题标题】:How to work with the MSAdminBase COM object in .NET?如何在 .NET 中使用 MSAdminBase COM 对象?
【发布时间】:2011-10-05 03:35:28
【问题描述】:

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

它完全可以从 C 代码中使用,但我希望用 .NET 代码替换它,这真是太糟糕了 - ADMWPROX.DLL 不会作为 tlbimp 的有效类型库出现:

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 方便地包装,但前者不是 - 因此是我的痛苦。

【问题讨论】:

标签: .net com


【解决方案1】:

好的,我就是这样做的:

  1. 将 IMSAdminBase_W 接口定义转换为 IDL。该接口在 Microsoft SDK 的 iadmw.h 中声明。它包含了 cmets 内部的所有 IDL 属性,因此转换很容易。当然,IDL 也需要声明 coclass 和库。
  2. 然后我用midl编译了IDL文件。
  3. 接下来,我对生成的 tlb 文件运行 tlbimp。
  4. 最后,必须修复生成的互操作 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 对其进行反编译。事实上,我只是将反编译的互操作源作为我项目的一部分。

就是这样。

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

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2010-11-08
    • 2011-06-15
    • 2012-04-08
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多