gpt4 book ai didi

c# - COM 返回不实现任何接口(interface)的类型

转载 作者:行者123 更新时间:2023-11-30 12:34:09 25 4
gpt4 key购买 nike

我需要通过 .NET 4.0 应用程序在 Adob​​e InDesign CS3 中自动执行某些任务。我使用 Visual Studio 中的“添加引用”对话框添加了对 InDesign 类型库的引用。它会生成一个互操作程序集,其中正确包含类型库中声明的所有接口(interface)和类型。我没有安装任何 Adob​​e SDK,因为类型库在 Visual Studio 中可用,除了 Adob​​e InDesign CS3 之外没有安装任何东西。

目前对我来说,interop 程序集中有趣的类型是接口(interface) _ApplicationApplication,以及类 ApplicationClass。下面是它们的定义,所以你可以看到它们之间的关系:

public interface _Application
{
// Lots of properties and methods
}

public interface Application : _Application
{
// Empty
}

public class ApplicationClass : _Application, Application
{
// The same properties and methods as declared in _Application
}

我尝试像这样实例化 COM 对象:

Type oType = Type.GetTypeFromProgID("InDesign.Application.CS3");
if (oType != null)
{
object instance = Activator.CreateInstance(oType);
}

此代码成功。我得到了一个实例,但类型为 __ComObject。据我所知,这是完全正常的。

现在,这就是乐趣的开始。为了让这个实例对我可用,我应该将它转换为正确的接口(interface)。来自网络上的其他示例,以及 documentation available here ,我可以看到我应该将它转换为 Application 接口(interface)。但是如果我这样做,我会得到一个讨厌的 InvalidCastExceptionSystem.__ComObject 类型不支持这个接口(interface)。如果我尝试将其转换为 ApplicationClass_Application 接口(interface),我会得到同样的异常。

我想我可能使用了不正确的接口(interface),所以我尝试实现实用函数 listed here .此函数循环遍历互操作程序集中声明的所有接口(interface),并查询 IUnknown 接口(interface)(如果它实现了该接口(interface))。

当我使用该函数时,它返回 null,这意味着我从 CreateInstance 返回的实例不支持互操作程序集中的 接口(interface)。当然,这不可能!?

但是,如果我使用 Visual Studio 调试器检查 instance 变量,就会发现有一个叫做“动态 View ”的东西。如果我展开它,它会列出该对象的所有属性,并且所有属性都与 ApplicationClass 类和 _Application 接口(interface)的属性相匹配。所以我尝试使用 Type.InvokeMember 并且有效:

oType.InvokeMember("DoScript", BindingFlags.InvokeMethod, null, instance, oArguments, CultureInfo.InvariantCulture);

这个确实可以,但是像这样和COM对象交互会非常麻烦,而且我需要和COM对象做很多交互,所以这个不是很实用。我想我可以为 COM 对象制作一个包装器,但这种做法违背了互操作程序集的目的,而且我不想创建 700 多个包装器类。

我搜索了很多,找到了使用 InDesign COM 对象的教程和示例,但它们都只是将返回的实例转换为应用程序界面,但如前所述,这对我的情况不起作用。

我还尝试了以下代码而不是上面的代码:

InDesign.Application app = new InDesign.Application();
app.Activate();

第一行成功,我得到了 ApplicationClass 的一个实例,但是当它尝试执行第二行时,我得到一个 InvalidCastException,指出 ApplicationClass 不能转换为接口(interface) _Application

我真的被困在这里了,不知道接下来该尝试什么。我真的希望对 COM 和 .NET 更有经验的人知道我可能做错了什么。

提前致谢,抱歉发了这么长的帖子。

最佳答案

你必须使用 Runtime Callable Wrapper

你需要的方法是this one

试试这个:

    Type oType = Type.GetTypeFromProgID("InDesign.Application.CS3");
if (oType != null)
{
object instance = Activator.CreateInstance(oType);// or any other way you can get it
Application app =
(Application)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(instance, typeof(ApplicationClass));
}

关于c# - COM 返回不实现任何接口(interface)的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757255/

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