本文介绍SolidWorks C# add-in二次开发环境的搭建。

1.开发环境介绍

首先安装好Visual Studio和对应的.NET Framework 4.8版本,SolidWorks二次开发包也要确保安装,我的环境配置如下:

  • 主机操作系统:Windows 11 X64
  • Visual Studio版本:Visual Studio 2026 社区版
  • SolidWorks版本:2020 X64
  • .NET版本:.NET Framework 4.8

2. Visual Studio工程设置

新建项目,选择Visual C#分类下的类库Class Library(.NET Framework)模板 (注意类库有两个选项,要选择带.NET Framework的),设置项目存储路径与项目名称,如图1所示:

图1 创建C#类库项目

在弹出的对话框中设置.NET Framework版本为4.8,适配SolidWorks 2020:

图2 设置.NET Framework版本

SolidWorks全系列都是64位,AnyCPU会注册失败,需要先将工程设置为X64再进行设置(测试了下,这个说法并不可靠,我用AnyCPU是可以跑的)。添加引用,SolidWorks的引用一般放在SolidWorks Installation Folder\api\redist文件夹下,刚开始开发,需要添加SolidWorks.Interop.sldworks.dll、SolidWorks.Interop.swconst.dll、SolidWorks.Interop.swpublished.dll三个核心库,并将其“嵌入互操作类型 (Embed Interop Types)”属性设为False。

图3 添加SolidWorks引用

图4 设置“嵌入互操作类型 (Embed Interop Types)”属性

为方便调试,在项目“调试”选项中设置“启动外部程序”选项,填入SolidWorks主程序sldworks.exe的完整安装路径,可实现调试时VS自动启动SolidWorks并开始调试:

图5 设置调试

此步可选,只是为了让开发更快捷一些。SolidWorks插件通过注册COM组件的方式运行,插件注册要求插件dll必须使用/codebase标志。由于注册组件需要管理员权限,所以建议使用以管理员权限启动Visual Studio,在项目“生成事件”选项中设置“生成后命令行”,添加"%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm" /codebase "$(TargetPath)",这样每次重新编译都会重新注册组件,防止因为大变动导致COM组件注册出错。

图6 设置生成后命令行

如果需要卸载插件,则可以运行:

1
RegAsm.exe MySampleAddin.dll /u /codebase

点击“工具—生成GUID”菜单,在弹出的对话框中选择第5项,点击复制按钮,获取生成的GUID。设置项目COM可见,在代码中添加如下代码:

1
2
3
4
5
6
[ComVisible(true)]
[Guid("31B803E0-7A01-4841-A0DE-895B726625C9")]
public class MySampleAddin : ISwAddin
{
// 其余代码
}

图7 获得GUID

注意:开发时如果项目复制到别的目录或者计算机下,可能会出现GUID重复或者不一致的问题,此时需要生成新的GUID。

3.代码撰写

具体代码暂时还没研究,直接借用Creating C# add-in for SOLIDWORKS automation using API提供的代码,详细的各项设置留待以后研究:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//**********************
//Copyright(C) 2025 Xarial Pty Limited
//Reference: https://www.codestack.net/solidworks-api/getting-started/add-ins/csharp/
//License: https://www.codestack.net/license/
//**********************

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swpublished;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;

namespace SampleAddIn
{
[ComVisible(true)]
[Guid("31B803E0-7A01-4841-A0DE-895B726625C9")]
[DisplayName("Sample Add-In")]
[Description("Sample 'Hello World' SOLIDWORKS add-in")]
public class MySampleAddin : ISwAddin
{
#region Registration

private const string ADDIN_KEY_TEMPLATE = @"SOFTWARE\SolidWorks\Addins\{{{0}}}";
private const string ADDIN_STARTUP_KEY_TEMPLATE = @"Software\SolidWorks\AddInsStartup\{{{0}}}";
private const string ADD_IN_TITLE_REG_KEY_NAME = "Title";
private const string ADD_IN_DESCRIPTION_REG_KEY_NAME = "Description";

[ComRegisterFunction]
public static void RegisterFunction(Type t)
{
try
{
var addInTitle = "";
var loadAtStartup = true;
var addInDesc = "";

var dispNameAtt = t.GetCustomAttributes(false).OfType<DisplayNameAttribute>().FirstOrDefault();

if (dispNameAtt != null)
{
addInTitle = dispNameAtt.DisplayName;
}
else
{
addInTitle = t.ToString();
}

var descAtt = t.GetCustomAttributes(false).OfType<DescriptionAttribute>().FirstOrDefault();

if (descAtt != null)
{
addInDesc = descAtt.Description;
}
else
{
addInDesc = t.ToString();
}

var addInkey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(
string.Format(ADDIN_KEY_TEMPLATE, t.GUID));

addInkey.SetValue(null, 0);

addInkey.SetValue(ADD_IN_TITLE_REG_KEY_NAME, addInTitle);
addInkey.SetValue(ADD_IN_DESCRIPTION_REG_KEY_NAME, addInDesc);

var addInStartupkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(
string.Format(ADDIN_STARTUP_KEY_TEMPLATE, t.GUID));

addInStartupkey.SetValue(null, Convert.ToInt32(loadAtStartup), Microsoft.Win32.RegistryValueKind.DWord);
}
catch (Exception ex)
{

Console.WriteLine("Error while registering the addin: " + ex.Message);
}
}

[ComUnregisterFunction]
public static void UnregisterFunction(Type t)
{
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 (Exception e)
{
Console.WriteLine("Error while unregistering the addin: " + e.Message);
}
}

#endregion

private ISldWorks m_App;

public bool ConnectToSW(object ThisSW, int Cookie)
{
m_App = ThisSW as ISldWorks;

m_App.SendMsgToUser("Hello World!");

return true;
}

public bool DisconnectFromSW()
{
return true;
}
}
}

完整代码可在Github.com下载。

参考网址

[1] Creating C# add-in for SOLIDWORKS automation using API.