gpt4 book ai didi

c# - IsAssignableFrom 与 COM

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:38 28 4
gpt4 key购买 nike

我正在使用 COM-API,Autodesk Inventor。

此测试通过:

[Test]
public void CastTest()
{
Inventor.Document document = _application.ActiveDocument;
var assemblyDocument = (Inventor.AssemblyDocument)document;
Assert.NotNull(assemblyDocument);
}

这个测试失败了:

[Test]
public void IsAssignableFromTest()
{
Assert.IsTrue(typeof(Inventor.Document).IsAssignableFrom(typeof(Inventor.AssemblyDocument)));
}

我对 COM 了解不多,有没有一种方法可以使用反射或某些 COM 巫术来检查一种 COM 类型是否“继承”了另一种类型?

最佳答案

COM 类型系统与 .NET 不兼容。相反,您正在针对包装器(所谓的 RCW)进行编程。为了测试您是否可以将一个 COM 对象转换为另一个对象,COM 提供了 QueryInterface - 作为 IUnknown 成员的方法,每个 COM 对象都必须实现。然而,.NET 为您隐藏了这些细节,因此您可以编写“感觉”像 .NET 代码的 COM 代码。

如果您看一下 Inventors interop-library 的反汇编,您会发现 DocumentAssemblyDocument 之间没有直接关系。两者都是仅实现各自组件类的默认接口(interface)的接口(interface),并且具有 CoClassAttribute 属性。但是在他们的继承树上,他们并没有直接的关联。它们可能都实现了相同的界面(我猜像 IDocument),但您也不能将 WinForms 按钮转换为图片框,即使它们都实现了 Control-界面。

这就是反射和 IsAssignableFrom 正在测试的内容:每个 CLR 类型提供的元数据。 COM 在这里工作不同。每个 COM 对象都可以自行“决定”它是否可以从另一个接口(interface)调用。因此它实现了 QueryInterface。因此,在执行测试之前,您必须创建源类型的实例(COM 不知道静态成员)。

传统的转换确实会调用 QueryInterface,因此您的测试可能看起来像:

[Test]
public void IsAssignableFromTest()
{
Assert.IsNotNull(_application.ActiveDocument as Inventor.AssemblyDocument);
}

否则你可以调用QueryInterface直接通过 Marshal 类。

但是,无法通过 COM 对象的反射来测试类型元数据。

关于c# - IsAssignableFrom 与 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23885002/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com