从 WPF 调用 COM,即使使用 STAThread 也获得 E_NOINTERFACE

我正在尝试遵循这个答案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 component

for 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,但这并不能解释为什么它可以从控制台运行,是吗?


慕容3067478
浏览 246回答 1
1回答

墨色风雨

显然我做了两个致命的假设:控制台应用程序使用 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()    {
打开App,查看更多内容
随时随地看视频慕课网APP