.NET (Core)连接CATIA V5/V6 COM组件异常求助
.NET 连接远程CATIA COM组件时获取对象后无法操作的问题
问题背景
我正尝试从.NET Framework迁移至.NET,但新版.NET中没有.NET Framework里的GetObject/GetActiveObject方法,因此自行实现了Marshal2类。目前能成功获取CATIA.APPLICATION对象,但无法对其进行操作或读取属性,例如执行读取Caption属性的代码时会返回通用错误HRESULT E_FAIL。
需要说明的是,CATIA安装在远程机器上,我无权在该机器上安装Visual Studio,因此必须使用GetObject的等效方法。
问题复现代码
Dim CATIA = Marshal2.GetActiveObject("CATIA.APPLICATION") Dim caption as string = CATIA.Caption ' 此处返回通用错误`HRESULT E_FAIL`
自定义Marshal2类代码
Imports System.Runtime.InteropServices Imports System.Security Private Class Marshal2 Friend Const OLEAUT32 As String = "oleaut32.dll" Friend Const OLE32 As String = "ole32.dll" <SecurityCritical> Public Shared Function GetActiveObject(ByVal progID As String) As Object Dim obj As Object = Nothing Dim clsid As Guid ' 先调用CLSIDFromProgIDEx,如果不存在则回退到CLSIDFromProgID Try CLSIDFromProgIDEx(progID, clsid) Catch ex As Exception CLSIDFromProgID(progID, clsid) End Try GetActiveObject(clsid, IntPtr.Zero, obj) Return obj End Function <DllImport(OLE32, PreserveSig:=False)> <ResourceExposure(ResourceScope.None)> <SuppressUnmanagedCodeSecurity> <SecurityCritical> Private Shared Sub CLSIDFromProgIDEx(<MarshalAs(UnmanagedType.LPWStr)> ByVal progId As String, ByRef clsid As Guid) End Sub <DllImport(OLE32, PreserveSig:=False)> <ResourceExposure(ResourceScope.None)> <SuppressUnmanagedCodeSecurity> <SecurityCritical> Private Shared Sub CLSIDFromProgID(<MarshalAs(UnmanagedType.LPWStr)> ByVal progId As String, ByRef clsid As Guid) End Sub <DllImport(OLEAUT32, PreserveSig:=False)> <ResourceExposure(ResourceScope.None)> <SuppressUnmanagedCodeSecurity> <SecurityCritical> Private Shared Sub GetActiveObject(ByRef rclsid As Guid, ByVal reserved As IntPtr, <MarshalAs(UnmanagedType.Interface)> ByRef ppunk As Object) End Sub End Class
内容的提问来源于stack exchange,提问作者N.TW12
相关产品推荐
相关产品推荐

