为SOLIDWORKS创建VB.NET插件:API实战应用

  • 在 Microsoft Visual Studio 中创建新项目。
  • 在“Visual Basic 模板”下选择“类库”模板。指定项目的位置和名称。

在Visual Studio中创建新的VB.NET类库项目

  • 添加对 SolidWorks Interop 库的引用:SolidWorks.Interop.sldworks.dll、SolidWorks.Interop.swconst.dll、SolidWorks.Interop.swpublish.dll。互操作库位于 SOLIDWORKS安装文件夹\api\redist(面向框架 4.0 及更高版本的项目)和 SOLIDWORKS安装文件夹\api\redist\CLR2(面向框架 2.0 和 3.5 的项目)。

如果项目面向框架 4.0,我建议将所有 SOLIDWORKS 互操作 dll 的嵌入互操作类型选项设置为 false。在某些情况下,嵌入式互操作库会导致类型转换问题,从而影响功能并可能导致崩溃。

嵌入 SOLIDWORKS 互操作

  • 添加一个公共类(public class),并取一个对用户友好的名称。这将是插件的主类。此类必须是公共的且 COM 可见。我建议使用 ComVisible特性和 Guid特性修饰该类,以向 COM 公开此类,并分配永久全局唯一标识符 (GUID):
<ComVisible(True)>
<Guid("799707B3-1632-469F-B294-EC05A5FBFFC8")>
Public Class MySampleAddin
	Implements ISwAddin
    ...
End Class

避免在项目设置中选择“使程序集 COM 可见”选项来向 COM 公开类型,仅使用上述属性将所需的类标记为 COM 可见即可。

  • 插件dll 必须使用 /codebase 标志注册。注册项目设置中可用的 COM 互操作选项在注册时不使用此选项,因此不适合这种情况,此外,此选项将在 32 位注册表中注册类型,而 SOLIDWORKS 需要 64 位注册表中的条目。而是添加生成后操作,如下所示:
"%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm" /codebase "$(TargetPath)"

发布生成事件以将 dll 注册为 COM 对象

这将确保在每次编译插件项目后进行适当的注册。

  • 为了增强调试体验,我建议在项目设置中将 SOLIDWORKS 的完整路径指定为外部应用程序。

在调试插件时将 SOLIDWORKS 作为外部程序启动

这将允许通过按绿色运行按钮或 F5 键自动启动 SOLIDWORKS,并从Visual Studio 附加调试器。

  • 需要将注册表信息添加到SOLIDWORKS注册表分支,使其对应用程序可见。为了简化过程,当dll注册和取消注册为COM对象时,可以通过定义函数并使用ComRegisterFunction特性和ComUnregisterFunction特性修饰它们来自动添加和删除此信息。
  • 复制粘贴插件代码,如下所示并编译项目。
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
  • 编译时,可以忽略 Visual Studio 窗口中显示的以下警告。

未签名程序集编译警告

上面的代码可以在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/

仅供学习使用。 

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空