0

我正在开发的程序将在 AutoCAD 2013 和 2002 上使用。所以,我正在做的是检查用户是否有 2013 以及是否不存在尝试 2002。当代码将AcadApplication对象链接到2002年打开的实例。

代码:

_progID_2002 = "AutoCAD.Application.15";
_progID_2013 = "AutoCAD.Application.19";

try
{
    Type acType = Type.GetTypeFromProgID(_progID_2002);
    _acadApp = (AcadApplication)Activator.CreateInstance(acType, true);
}
catch
{
    // Try other version, or exit
}

所以当我使用_progID_2013. 它会打开 AutoCAD 2013 并_acadApp进行链接。当我尝试使用它时,_progID_2002它会打开 AutoCAD 2002,但是当我设置_acadApp为打开的实例时,它会引发异常:

InvalidCastException
Unable to cast COM object of the type 'System._ComObject' to interface type   
'AutoCAD.AcadApplication'. This operation failed because the QueryInterface 
call on the COM component for the interface with IID '{070AA05D-DFC1-4E64-
8379-432269B48B07}' failed due to the following error: No such interface
supported (Exception from HRESULT:0x80004002 (E_NOINTERFACE)).

我尝试使用 2000 和 2013 互操作库,但没有成功。

4

2 回答 2

1

问题不在于版本,因为您使用 COM 来获取 AutoCAD。GetObject 调用在 VB6 天就起作用了,所以并不是无法创建 AutoCAD.Application.15 对象,而是您试图将其转换为不匹配的已定义类型。在您的项目中,您加载了哪些定义 AcadApplication 类型的程序集?我可以向你保证 2002 和 2013 版本不能一起玩。

我会在 .NET 4.0 中构建这个项目,并让 _acadApp 成为动态变量。

Dynamic _acadApp;
try
{
    Type acType = Type.GetTypeFromProgID(_progID_2002);
    _acadApp = Activator.CreateInstance(acType, true);
}

这意味着您在编写时不会有任何智能感知,即使您输入了不存在的方法/属性,它也会编译。这意味着您可能有适用于 2002 年而非 2013 年的方法,反之亦然。如果您必须使用 .NET 3.5 或更低版本,反射将是您的最佳选择。

于 2013-09-28T15:37:12.913 回答
0

在弄乱Locke给出的答案时,我发现如果我将应用程序作为x64而不是x86运行,该应用程序将与Acad 2002一起使用。我必须使用2000对象库,它不会再打开2013,因为同样的错误。所以,我必须构建两个不同版本的应用程序。一种用于 2002 版本的以 x64 运行,另一种用于 2013 版本,无论是 x64 还是 x86 都可以使用。比我聪明的人可能会告诉我们原因。

于 2013-09-30T17:07:31.663 回答