Приведение во время выполнения COM-объектов в C # - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю над приложением, которое должно взаимодействовать через COM-интерфейс с несколькими приложениями CAD ( не одновременно ).Я хочу иметь хороший и многократно используемый код, , но я столкнулся с проблемами приведения типов 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

Любые идеи , как я могу сделать это во время выполнения, приведя мой код в максимально возможное повторное использование?

Настройка моего программного обеспечения:

  • Win 10
  • Проект рассчитан на .NET 4.7.2
  • Первые тесты в Solidworks 2019

1 Ответ

0 голосов
/ 30 декабря 2018

Оказывается, что моя попытка кодирования была действительным кодом C # действительно. Я пробовал использовать Autodesk Inventor, и он работает.

Так что мне остается только сделать вывод, что это какая-то ошибка в Solidworks и их COM-интерфейсе.

Спасибо Необязательный параметр за проявленный интерес к теме.

...