创建SOLIDWORKS C#独立应用程序教程

在本教程中,我将演示如何使用 C# 和 Microsoft Visual Studio 从进程外(也称为独立)应用程序(例如 Windows Forms、Windows 控制台)连接到 SOLIDWORKS 应用程序。

有关本文中讨论的方法的更详细说明,请阅读《如何使用SOLIDWORKS API创建独立(exe)应用程序》一文。

如何使用SOLIDWORKS API创建独立(exe)应用程序 在本文中,我将讨论从COM兼容编程语言(例如C#,VB.NET,C++,Visual Basic 6)连接到SOLIDWORKS实例的2种通用方法,以便使用SOLIDWORKS API。这是这些可选方法的详细说明。请点击以下链接访问演示如何创建示例项目并连接到 SOLIDWORKS 实例的文章:Using C# (https://www.codestack.net/solidworks-api/getting-started/stand-alone/connect-csharp/)Using VB.NET 文章 Hongfe... 384 3 0

创建新项目

我将使用Microsoft Visual Studio开发环境。您可以使用任何版本的 Visual Studio。相同的代码适用于专业版、精简版或社区版。

  • 打开 Visual Studio。
  • 启动新项目:

  •    在 Visual Studio 中创建新项目
     
  • 选择项目模板。我建议从控制台应用程序项目模板开始,因为它包含最少的预生成代码:

  •    选择 C# 控制台应用程序项目模板
     
  • 添加对 SolidWorks 互操作库的引用。 互操作库文件位于SOLIDWORKS安装文件夹\api\redist\SolidWorks.Interop.sldworks.dll(用于面向 Framework 4.0 及更高版本的项目),SOLIDWORKS安装文件夹\api\redist\CLR2\SolidWorks.Interop.sldworks.dll(用于面向框架 2.0 和 3.5 的项目)。

  •    向项目添加程序集引用
     

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


   嵌入互操作程序集的选项
 

现在我们可以添加代码以连接到 SOLIDWORKS 实例。

创建或连接到SOLIDWORKS实例

连接到 COM 服务器的最常见和最快速的方法可能是使用 Activator::CreateInstance方法。(https://learn.microsoft.com/zh-cn/dotnet/api/system.activator.createinstance)


var progId = "SldWorks.Application";

var progType = System.Type.GetTypeFromProgID(progId);

var app = System.Activator.CreateInstance(progType) as SolidWorks.Interop.sldworks.ISldWorks;
app.Visible = true;

此方法将从类型定义构造类型的实例。由于SOLIDWORKS应用程序已注册为COM服务器,因此我们可以通过 Type::GetTypeFromProgID方法(https://learn.microsoft.com/zh-cn/dotnet/api/system.type.gettypefromprogid)从其程序标识符创建类型。请阅读《如何使用SOLIDWORKS API创建独立(exe)应用程序》一文,了解此方法的限制说明。

或者,您可以使用 Marshal::GetActiveObject方法(https://learn.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.marshal.getactiveobject)连接到SOLIDWORKS的活动(已启动)会话。此方法将确保不会创建新的SOLIDWORKS实例,如果没有要连接的正在运行的 SOLIDWORKS 会话,则会抛出异常。


var progId = "SldWorks.Application";

var app = System.Runtime.InteropServices.Marshal.GetActiveObject(progId) as SolidWorks.Interop.sldworks.ISldWorks;

通过 ROT 获取正在运行的实例

为了连接到已经运行的特定 SOLIDWORKS 会话或能够创建多个会话,您可以使用正在运行的对象表 API。请阅读《如何使用SOLIDWORKS API创建独立(exe)应用程序》一文,了解有关此方法的更多详细信息。


using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using SolidWorks.Interop.sldworks;

namespace CodeStack.Sample
{
    class Program
    {
        [DllImport("ole32.dll")]
        private static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc);

        static void Main(string[] args)
        {
            const string SW_PATH = @"C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe";

            try
            {
                var app = StartSwApp(SW_PATH);
                Console.WriteLine(app.RevisionNumber());
            }
            catch(Exception ex)
            {
                Console.WriteLine("Failed to connect to SOLIDWORKS instance: " + ex.Message);
            }

            Console.ReadLine();
        }

        private static ISldWorks StartSwApp(string appPath, int timeoutSec = 10)
        {
            var timeout = TimeSpan.FromSeconds(timeoutSec);

            var startTime = DateTime.Now;

            var prc = Process.Start(appPath);
            ISldWorks app = null;

            while (app == null)
            {
                if (DateTime.Now - startTime > timeout)
                {
                    throw new TimeoutException();
                }

                app = GetSwAppFromProcess(prc.Id);
            }

            return app;
        }

        private static ISldWorks GetSwAppFromProcess(int processId)
        {
            var monikerName = "SolidWorks_PID_" + processId.ToString();

            IBindCtx context = null;
            IRunningObjectTable rot = null;
            IEnumMoniker monikers = null;

            try
            {
                CreateBindCtx(0, out context);

                context.GetRunningObjectTable(out rot);
                rot.EnumRunning(out monikers);

                var moniker = new IMoniker[1];

                while (monikers.Next(1, moniker, IntPtr.Zero) == 0)
                {
                    var curMoniker = moniker.First();

                    string name = null;

                    if (curMoniker != null)
                    {
                        try
                        {
                            curMoniker.GetDisplayName(context, null, out name);
                        }
                        catch (UnauthorizedAccessException)
                        {
                        }
                    }

                    if (string.Equals(monikerName,
                        name, StringComparison.CurrentCultureIgnoreCase))
                    {
                        object app;
                        rot.GetObject(curMoniker, out app);
                        return app as ISldWorks;
                    }
                }
            }
            finally
            {
                if (monikers != null)
                {
                    Marshal.ReleaseComObject(monikers);
                }

                if (rot != null)
                {
                    Marshal.ReleaseComObject(rot);
                }

                if (context != null)
                {
                    Marshal.ReleaseComObject(context);
                }
            }

            return null;
        }
    }
}

在上面的示例中,通过从SOLIDWORKS应用程序安装路径启动新进程来启动SOLIDWORKS的新会话。StartSwApp 函数需要 sldworks.exe 的完整路径作为第一个参数,可选的timeout(超时,以秒为单位)作为第二个参数。超时将确保在进程无法启动的情况下应用程序不会被锁定。

您还可以使用异步调用,以便在SOLIDWORKS启动时在应用程序中显示一些进度指示:


static async System.Threading.Tasks.Task<SolidWorks.Interop.sldworks.ISldWorks> StartSwAppAsync(
    string appPath, int timeoutSec = 10)
{
    return await System.Threading.Tasks.Task.Run(() =>
    {
        return StartSwApp(appPath, timeoutSec);
    });
}



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

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

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

* 公司名称:

姓名不为空

手机不正确

公司不为空