【问题标题】:Error on opening different versions of AutoCAD打开不同版本的 AutoCAD 时出错
【发布时间】:2014-01-09 21:56:34
【问题描述】:

我正在开发的程序将在 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 互操作库,但没有成功。

【问题讨论】:

    标签: c# com autocad


    【解决方案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 或更低版本,反射将是您的最佳选择。

    【讨论】:

    • 谢谢,我得等到星期一才能试用。我会告诉你的。
    • 好的,所以我将 _acadApp 切换为动态,当我设置 _acadApp 时它不会给我错误,但是每当我尝试从中获取一些东西时,比如 ActiveDocument 或 SelectionSet,它就会给我错误然后。因此,我必须将我正在使用的任何 Acad 对象也切换为动态对象以使其工作。谢天谢地,因为我已经设置好了所有东西,所以我不必担心没有任何智能感知。我还发现了别的东西。我也会把它作为答案发布。
    • 很高兴你把它整理好了。我喜欢做与您相同的事情,即使用 COM 程序集编写代码(假设我需要 COM 与内部 API),然后当它准备好启动时,我删除引用并将必要的类型更改为动态的。非常适合 Office 应用程序,无需纠结版本依赖关系。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2020-04-20
      • 2016-01-29
      • 2022-01-18
      • 2015-08-08
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多