我正在研究的程序将用于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互操作库而没有运气。
答案 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都可以使用。比我聪明的人可能会告诉我们原因。