为了账号安全,请及时绑定邮箱和手机立即绑定

从 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 关注
  • 245 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信