C# .NET Core中不支持此类接口(0x80004002)

C# .NET Core中不支持此类接口(0x80004002),c#,.net-core,directshow.net,C#,.net Core,Directshow.net,我正在尝试移植.NET标准。在.NET Framework 4.6.2中将Xml2Dex转换为IXml2Dex接口时,我没有问题。然而,我在.NETCore3.1中有InvalidCastException COM导入 试验 例外情况 无法将类型为“DirectShowLib.DES.Xml2Dex”的COM对象强制转换为接口类型 “DirectShowLib.DES.IXml2Dex”。此操作失败,因为 对具有IID的接口的COM组件的QueryInterface调用 由于以下原因,{18C6

我正在尝试移植.NET标准。在.NET Framework 4.6.2中将
Xml2Dex
转换为
IXml2Dex
接口时,我没有问题。然而,我在.NETCore3.1中有
InvalidCastException

COM导入 试验 例外情况 无法将类型为“DirectShowLib.DES.Xml2Dex”的COM对象强制转换为接口类型 “DirectShowLib.DES.IXml2Dex”。此操作失败,因为 对具有IID的接口的COM组件的QueryInterface调用 由于以下原因,{18C628ED-962A-11D2-8D08-00A0C9441E20}失败 错误:不支持此类接口(0x80004002(E_NOINTERFACE))


STAThread
模式下运行测试可以解决此问题。但是为什么它在.NETFramework上工作而不使用单线程模式呢?我做错什么了吗?

你真正的问题是如何去做。COM库是特定于体系结构的。如果要使用x86组件,应用程序也必须是x86应用程序。另一个障碍是,顺便说一句,在Windows中10年是一个很长的时间。大部分DirectX功能已被UWP和相关服务取代。很可能,无论您在DirectShow中查找什么,都可以作为UWP服务或其他API使用。甚至是一个不同的环境,例如Unity3DCore对COM的支持不如Framework。据推测.NET5.0会有一些改进,但我不会指望这些改进。正如@PanagiotisKanavos所说,COM已经死了,你需要继续前进。这个接口没有代理,STA是一个硬得像石头一样的要求。我的水晶球说您的原始代码是Winforms项目或用VB.NET编写的。使项目的主线程默认为STA。顺便说一句,VB.NET的行为特别顽皮。
[ComImport, SuppressUnmanagedCodeSecurity,
InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("18C628ED-962A-11D2-8D08-00A0C9441E20")]
public interface IXml2Dex
{
    // Interface implementation..
}

[ComImport, Guid("18C628EE-962A-11D2-8D08-00A0C9441E20")]
public class Xml2Dex
{
}
// works on .NET Framework 4.6.2, failed on .NET Core 3.1
object xml2Dex = (IXml2Dex) new Xml2Dex();
Assert.IsTrue(xml2Dex is IXml2Dex);