Я пишу надстройку VB.NET для Solidworks, в которой мне сначала нужно подключиться к уже запущенному экземпляру Solidworks (аналогично тому, как создаются такие подключения к Excel).Я использую Marshal.GetActiveObject
метод:
Sub ConnectToSolidworks()
Const PROG_ID As String = "SldWorks.Application"
Dim progType = System.Type.GetTypeFromProgID(PROG_ID)
If progType Is Nothing Then MSG("Cannot detect a valid Solidworks installation.") : End : Application.Exit()
'connect to Solidworks
Try
swApp = TryCast(System.Runtime.InteropServices.Marshal.GetActiveObject(PROG_ID), SolidWorks.Interop.sldworks.ISldWorks)
Catch ex As Exception
printException(System.Reflection.MethodBase.GetCurrentMethod().Name, ex)
End Try
'check if connected
If swApp Is Nothing Then
MSG("Unable to connect to Solidworks.")
End
Application.Exit()
End If
End Sub
К сожалению, есть проблема.Если Solidworks запускается от имени администратора, а мое приложение - нет, или наоборот, Marshal.GetActiveObject
завершается с ошибкой HRESULT: исключение 0x800401E3.
Однако мне нужно, чтобы мое приложение работало без административного доступа и независимо от того, когда Solidworks запускался от имени администратора.
Причина, по которой я не использую Interaction.CreateObject
, Interaction.GetObject
или System.Activator.CreateInstance
, потому что эти методы запустят Solidworks самостоятельно, если он еще не запущен, чего я хочу избежать любой ценой.
Имея это в виду, как я могузаставить Marshal.GetActiveObject
работать, когда уровни несоответствия не соответствуют, или есть еще какой-то другой способ сделать это?Не удается создать компонент ActiveX ").