亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 WPF 調用 COM,即使使用 STAThread 也獲得 E_NOINTERFACE

從 WPF 調用 COM,即使使用 STAThread 也獲得 E_NOINTERFACE

C#
慕容3067478 2021-07-13 13:01:15
我正在嘗試遵循這個答案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個贊

顯然我做了兩個致命的假設:

  1. 控制臺應用程序使用 STA。然而這不是真的,似乎默認情況下它們是 MTA。我認為這個數字是因為桌面應用程序必須在 Main 方法中明確聲明 STA。

  2. 要進行 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()

    {


查看完整回答
反對 回復 2021-07-18
  • 1 回答
  • 0 關注
  • 272 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號