C#中COM对象的运行时强制转换

时间:2018-12-26 23:59:25

标签: c# com-interop

我正在开发一个需要通过COM接口与多个CAD应用程序通信的应用程序(不能同时)。我想拥有漂亮且可重用的代码,但是当我使用通用应用程序句柄getter方法时,遇到了COM对象类型转换的问题。

到目前为止我尝试过的事情:

  1. 如果可以的话,这是我最想要的尝试。

    public static TCadAppType CadApp<TCadAppType>()
    {
        dynamic cadApp = default(TCadAppType);
    
        //Here under Dynamic View/Message there is already an error
        //  Message = "Element not found. (Exception from HRESULT: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))"
        // cadVersion.Value evaluates to "SldWorks.Application"
        cadApp = (TCadAppType)Marshal.GetActiveObject(cadVersion.Value);
    
        //Following 2 lines of code are for testing purposes only, i am testing with Solidworks API 
        AssemblyDoc Assembly;
    
        //The exception is thrown when I try to access some method from the Solidworks API 
        Assembly = (AssemblyDoc)cadApp.OpenDoc6("some parametras...");
    
    }
    
  2. 尝试使用Convert类

    // Another attempt using  Convert class
    public static TCadAppType CadApp<TCadAppType>()
    {
        dynamic cadApp = default(TCadAppType);
        // cadVersion.Value evaluates to "SldWorks.Application"
        cadApp = Marshal.GetActiveObject(cadVersion.Value);
    
    
        cadApp = Convert.ChangeType(cadApp, typeof(SldWorks.SldWorks));
        // Exception is thrown with the following message:
        // Message = "Object must implement IConvertible."
    }
    

我真的以为自己是对的,因为Microsoft Docs网站上有一篇文章解释了动态如何帮助您进行com interopt:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/using-type-dynamic#com-interop

任何想法我如何在运行时如何强制转换代码以保持可重用性?

我的软件设置:

  • 赢10
  • 该项目面向.NET 4.7.2
  • 首次测试是在Solidworks 2019中进行的

1 个答案:

答案 0 :(得分:0)

事实证明,我的编码尝试1确实是有效的C#代码。 我曾与Autodesk Inventor一起使用过,并且可以正常工作。

因此,给我留下的唯一结论就是,这是Solidworks及其COM接口的一些错误。

here感谢您对此主题的关注。