跳到主要内容

使用API创建SOLIDWORKS自动化的C#插件

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

在Visual Studio中创建新的类型库项目{ width=450 }

  • 添加对SolidWorks Interop库的引用:SolidWorks.Interop.sldworks.dll、SolidWorks.Interop.swconst.dll、SolidWorks.Interop.swpublished.dll。Interop库位于SOLIDWORKS安装文件夹\api\redist,用于针对Framework 4.0及更高版本的项目,以及SOLIDWORKS安装文件夹\api\redist\CLR2,用于针对Framework 2.0和3.5的项目。

对于针对Framework 4.0的项目,建议将嵌入互操作类型选项设置为false。 否则,在调用SOLIDWORKS API时可能会出现类型转换问题,导致应用程序行为不可预测。

嵌入SOLIDWORKS互操作{ width=350 }

在一些教程中,会添加对solidworkstools.dll库的引用。该库是可选的,在本教程中不会使用。

  • 添加一个具有用户友好名称的公共类。这将是插件的主类。此类必须是公共的和COM可见的。我建议使用ComVisibleAttribute将类标记为COM可见对象,并使用GuidAttribute为插件类显式分配COM GUID:
[ComVisible(true)]
[Guid("31B803E0-7A01-4841-A0DE-895B726625C9")]
public class MySampleAddin : ISwAddin
{
...
}

我建议在项目设置中不选择使程序集COM可见选项,而只是像上面描述的那样将所需的类标记为COM可见。

使程序集COM可见标志{ width=400 }

  • 插件dll必须使用/codebase标志进行注册。项目设置中的注册COM互操作选项在注册时不使用此选项,因此在此情况下不适用。相反,添加以下后期构建操作:
"%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm" /codebase "$(TargetPath)"

后期构建事件将dll注册为COM对象{ width=400 }

这将确保在每次构建插件项目时进行正确的注册。

  • 为了获得更好的调试体验,我建议在项目设置中设置SOLIDWORKS的完整路径作为外部应用程序。

在调试插件时将SOLIDWORKS作为外部程序启动{ width=400 }

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

  • 需要将注册信息添加到SOLIDWORKS注册表分支中,以使其对应用程序可见。为了简化这个过程,可以通过定义函数并使用ComRegisterFunctionAttributeComUnregisterFunctionAttribute属性对它们进行自动添加和删除。

  • 复制并粘贴如下所示的插件代码,并编译项目

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;
}
}
}
  • 编译时可能会显示以下警告。

未签名程序集编译警告{ width=450 }

可以忽略此警告。

  • 运行SOLIDWORKS,启动时将显示Hello World消息框。

上述代码可以使用xCAD.NET Framework框架简化如下:

[Title("Sample Add-In")]
[Description("Sample 'Hello World' SOLIDWORKS add-in")]
[ComVisible(true), Guid("31B803E0-7A01-4841-A0DE-895B726625C9")]
public class MySampleAddIn : SwAddInEx
{
public override void OnConnect()
{
Application.ShowMessageBox("Hello World!");
}
}