打开不同版本的AutoCAD时出错

时间:2013-09-27 16:24:38

标签: c# com autocad

我正在研究的程序将用于AutoCAD 2013和2002.所以,我正在做的是检查用户是否有2013以及是否不存在来尝试2002.问题来自于代码链接{2002}打开的实例的AcadApplication对象。

代码:

_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互操作库而没有运气。

2 个答案:

答案 0 :(得分: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或更低版本,则可以采用Reflection。

答案 1 :(得分:0)

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