我正在开发一个需要通过COM接口与多个CAD应用程序通信的应用程序(不能同时)。我想拥有漂亮且可重用的代码,但是当我使用通用应用程序句柄getter方法时,遇到了COM对象类型转换的问题。
到目前为止我尝试过的事情:
如果可以的话,这是我最想要的尝试。
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...");
}
尝试使用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
任何想法我如何在运行时如何强制转换代码以保持可重用性?
我的软件设置:
答案 0 :(得分:0)
事实证明,我的编码尝试1确实是有效的C#代码。 我曾与Autodesk Inventor一起使用过,并且可以正常工作。
因此,给我留下的唯一结论就是,这是Solidworks及其COM接口的一些错误。
here感谢您对此主题的关注。