我需要通过 .NET 4.0 应用程序自动执行 Adobe InDesign CS3 中的一些任务。我已使用 Visual Studio 中的“添加引用”对话框添加了对 InDesign 类型库的引用。它生成一个互操作程序集,该程序集正确包含类型库中声明的所有接口和类型。我没有安装任何 Adobe SDK,因为类型库可以在 Visual Studio 中使用,而无需安装除 Adobe InDesign CS3 之外的任何内容。
现在对我来说,互操作程序集中有趣的类型是接口_Application
and Application
,以及班级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
。据我所知,这是完全正常的。
现在,乐趣开始了。为了使这个实例对我可用,我应该将其转换为正确的接口。来自网络上的其他示例以及来自此处提供文档 http://cssdk.host.adobe.com/sdk/1.0/docs/WebHelp/app_notes/id_obj_model.htm,我可以看到我应该将它投射到Application
界面。但如果我这样做,我会感到很恶心InvalidCastException
说的是类型System.__ComObject
不支持该接口。如果我尝试将其转换为,我会得到同样的异常ApplicationClass
or the _Application
界面。
我认为我可能使用了不正确的接口,所以我尝试实现实用程序函数此处列出 http://fernandof.wordpress.com/2008/02/05/how-to-check-the-type-of-a-com-object-system__comobject-with-visual-c-net/。该函数循环访问互操作程序集中声明的所有接口,并查询 IUnknown 接口(如果它实现了该接口)。
当我使用该函数时,它返回 null,这意味着我从中返回的实例CreateInstance
支持none互操作程序集中的接口。当然,这不可能是对的!?
但是,如果我检查instance
变量与 Visual Studio 调试器,有一个叫做“动态视图”的东西。如果我展开它,它会列出该对象的所有属性,并且所有属性都与ApplicationClass
类和_Application
界面。所以我尝试使用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
无法转换为接口_Application
.
我真的被困在这里,不知道下一步该尝试什么。我真的希望对 COM 和 .NET 更有经验的人能够了解我可能做错了什么。
预先感谢,并对这么长的帖子表示歉意。