在Visual Studio中创建新的VB.NET类库项目
如果项目面向框架 4.0,我建议将所有 SOLIDWORKS 互操作 dll 的嵌入互操作类型选项设置为 false。在某些情况下,嵌入式互操作库会导致类型转换问题,从而影响功能并可能导致崩溃。
嵌入 SOLIDWORKS 互操作
<ComVisible(True)>
<Guid("799707B3-1632-469F-B294-EC05A5FBFFC8")>
Public Class MySampleAddin
Implements ISwAddin
...
End Class
避免在项目设置中选择“使程序集 COM 可见”选项来向 COM 公开类型,仅使用上述属性将所需的类标记为 COM 可见即可。
"%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm" /codebase "$(TargetPath)"
发布生成事件以将 dll 注册为 COM 对象
这将确保在每次编译插件项目后进行适当的注册。
在调试插件时将 SOLIDWORKS 作为外部程序启动
这将允许通过按绿色运行按钮或 F5 键自动启动 SOLIDWORKS,并从Visual Studio 附加调试器。
Imports SolidWorks.Interop.sldworks
Imports SolidWorks.Interop.swpublished
Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Linq
Imports System.Runtime.InteropServices
<ComVisible(True)>
<Guid("799707B3-1632-469F-B294-EC05A5FBFFC8")>
<DisplayName("Sample Add-In")>
<Description("Sample 'Hello World' SOLIDWORKS add-in")>
Public Class MySampleAddin
Implements ISwAddin
Private Const ADDIN_KEY_TEMPLATE As String = "SOFTWARE\SolidWorks\Addins\{{{0}}}"
Private Const ADDIN_STARTUP_KEY_TEMPLATE As String = "Software\SolidWorks\AddInsStartup\{{{0}}}"
Private Const ADD_IN_TITLE_REG_KEY_NAME As String = "Title"
Private Const ADD_IN_DESCRIPTION_REG_KEY_NAME As String = "Description"
#Region "Registration"
<ComRegisterFunction>
Public Shared Sub RegisterFunction(ByVal t As Type)
Try
Dim addInTitle = ""
Dim loadAtStartup = True
Dim addInDesc = ""
Dim dispNameAtt = t.GetCustomAttributes(False).OfType(Of DisplayNameAttribute)().FirstOrDefault()
If dispNameAtt IsNot Nothing Then
addInTitle = dispNameAtt.DisplayName
Else
addInTitle = t.ToString()
End If
Dim descAtt = t.GetCustomAttributes(False).OfType(Of DescriptionAttribute)().FirstOrDefault()
If descAtt IsNot Nothing Then
addInDesc = descAtt.Description
Else
addInDesc = t.ToString()
End If
Dim addInkey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(String.Format(ADDIN_KEY_TEMPLATE, t.GUID))
addInkey.SetValue(Nothing, 0)
addInkey.SetValue(ADD_IN_TITLE_REG_KEY_NAME, addInDesc)
addInkey.SetValue(ADD_IN_DESCRIPTION_REG_KEY_NAME, addInTitle)
Dim addInStartupkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(String.Format(ADDIN_STARTUP_KEY_TEMPLATE, t.GUID))
addInStartupkey.SetValue(Nothing, Convert.ToInt32(loadAtStartup), Microsoft.Win32.RegistryValueKind.DWord)
Catch ex As Exception
Console.WriteLine("Error while registering the addin: " & ex.Message)
End Try
End Sub
<ComUnregisterFunction>
Public Shared Sub UnregisterFunction(ByVal t As Type)
Try
Microsoft.Win32.Registry.LocalMachine.DeleteSubKey(String.Format(ADDIN_KEY_TEMPLATE, t.GUID))
Microsoft.Win32.Registry.CurrentUser.DeleteSubKey(String.Format(ADDIN_STARTUP_KEY_TEMPLATE, t.GUID))
Catch e As Exception
Console.WriteLine("Error while unregistering the addin: " & e.Message)
End Try
End Sub
#End Region
Private m_App As ISldWorks
Public Function ConnectToSW(ByVal ThisSW As Object, ByVal Cookie As Integer) As Boolean Implements ISwAddin.ConnectToSW
m_App = TryCast(ThisSW, ISldWorks)
m_App.SendMsgToUser("Hello World!")
Return True
End Function
Public Function DisconnectFromSW() As Boolean Implements ISwAddin.DisconnectFromSW
Return True
End Function
End Class
未签名程序集编译警告
上面的代码可以在xCAD.NET框架(https://xcad.xarial.com/)的帮助下简化,如下所示:
<Title("Sample Add-In")>
<Description("Sample 'Hello World' SOLIDWORKS add-in")>
<ComVisible(True), Guid("799707B3-1632-469F-B294-EC05A5FBFFC8")>
Public Class MySampleAddIn
Inherits SwAddInEx
Public Overrides Sub OnConnect()
End Sub
End Class
文章翻译自https://www.codestack.net/
仅供学习使用。