我正在嘗試遵循這個答案https://stackoverflow.com/a/47295752/1237135,以獲得 IIS Express 網站的列表,其中涉及引用 Microsoft.Web.dll(這是一個 .NET 程序集,但是大概它使用 COM 調用)并調用此代碼using (var runtimeStatusClient = new RuntimeStatusClient()){ var workerProcess = runtimeStatusClient.GetWorkerProcess(19464); //there's more but this is all that is needed for failure}它實際上有效,代碼運行并具有有意義的數據,但是完成后幾秒鐘我收到此錯誤System.InvalidCastException: 'Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Web.RuntimeStatus.IRsca2_WorkerProcess'. This operation failed because the QueryInterface call on the COM componentfor the interface with IID '{B1341209-7F09-4ECD-AE5F-3EE40D921870}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).'E_NOINTERFACE 通常與不使用 STAThread 模型相關聯,但我已經驗證該線程是 STA。該代碼在控制臺應用程序環境中正常運行,但在 WPF 中不運行。上面的答案提到我還查看了 RegisteredUrlsInfo(在 Microsoft.Web.dll 中),發現它使用了兩個 COM 接口,IRsca2_Core (F90F62AB-EE00-4E4F-8EA6-3805B6B25CDD) IRsca2_WorkerProcess (B1341209-7F09-4ECD-AE5F-3EE40D921870)我看到另一個答案https://stackoverflow.com/a/1058978/1237135談到嘗試將其添加到您的 App.exe.manifest:iid="{C677308A-AC0F-427D-889A-47E5DC990138}"proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"baseInterface="{0000000000000000000000000 -YOUR-TLB-GUID-HERE}" /> 可以從 Visual Studio 生成的 Native.Namespace.Assembly.Name.manifest 中找到 TLBID,如下所示:但我不清楚這是否適用于此。我還想知道它是否是 DLL Hell,但這并不能解釋為什么它可以從控制臺運行,是嗎?
1 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
顯然我做了兩個致命的假設:
控制臺應用程序使用 STA。然而這不是真的,似乎默認情況下它們是 MTA。我認為這個數字是因為桌面應用程序必須在 Main 方法中明確聲明 STA。
要進行 COM 互操作,您必須使用 STA。我認為這是因為使用 STA 是解決網絡上 E_NOINTERFACE 問題的首選解決方案。但是,據我所知,某些 COM 可以使用 MTA??磥韺τ?Microsoft.Web.DLL,您需要 MTA。
所以我的解決方案是創建一個新線程(默認情況下將使用 MTA),例如。
public MainWindow()
{
InitializeComponent();
//Do use ThreadPool instead of this...
Thread thread = new Thread(new ThreadStart(() => { GetWebsites(); }));
thread.Start();
}
void GetWebsites()
{
- 1 回答
- 0 關注
- 272 瀏覽
添加回答
舉報
0/150
提交
取消