2011-07-14 39 views
1

這個對象在%WINDIR實現%\ SYSTEM32 \ ADMWPROX.DLL - 見HKEY_CLASSES_ROOT\CLSID\{70B51430-B6CA-11D0-B9B9-00A0C922E750}如何在.NET中使用MSAdminBase COM對象?

距離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> 

和當然,它是從COM對象的列表中添加在Visual Studio中的COM引用時失蹤。

請幫忙。

P.S.

我想設置IIS://localhost/W3SVC/1!SslCertHash財產和this article解釋說,只有這樣,才能做到這一點是通過MSAdminBase對象,而不是MSAdminObject(由於模式定義的錯誤)。後者由.NET System.DirectoryServices.DirectoryEntry方便地包裝,但前者不是 - 因此是我的痛苦。

+0

哎呀,我的問題似乎與http://stackoverflow.com/questions/1037786/using-a-com-dll-from-c-without-a-type-library某種程度上重疊 - 投票決定關閉 – mark

回答

1

OK,這裏是我是如何做的:

  1. 轉換的IMSAdminBase_W接口定義IDL。該接口在Microsoft SDK中的iadmw.h中聲明。它包含註釋中的所有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反編譯它。事實上,我只是將反編譯的interop源文件作爲我的項目的一部分。

就是這樣。

我沒有創建互操作的源代碼作爲第一個也是唯一一步,因爲IMSAdminBase_W接口是相當大的,所以我更願意將其轉換爲IDL,這是更容易。

相關問題