Post

STK二次开发(C#)指北

记录在使用C#进行STK二次开发时的操作

准备工作

在新建项目前,对于 STK 9 和 STK 11,均需以管理员权限运行STK Install Folder\bin\AgPluginReg.exe以注册所有.dll文件

新建项目

新建项目时,注意 STK 9 和 STK 11 均只支持 .NET Framework 而不支持 .NET Core;但是,有时需要应用到 C# 的新语法或特性时,又不得不使用 .NET Core(比如要使用 CommunityToolkit.Mvvm 的生成器,就必须使用 .NET Core

在这种情况下,一种方式是将需要使用新语法或特性的内容从主程序中抽离出来,用 .NET Standard 2.0 的类库包装这些内容,再在类库中应用新语法或特性;另一种方式则是使用 .NET Core 的主程序,但将目标平台设置为 .Net Framework

实际上关于 .NET Core.NET Framework 的选择在 STK 11中并没有那么重要,根据笔者的开发过程来看,在二种情况下,可视化组件貌似都可以正常使用;不过,以防万一,还是建议使用 .NET Framework 或是使用 .NET Core 的主程序,但将目标平台设置为 .Net Framework为好

构建平台选择

在项目属性(Properties)中,对于构建(Build)中的目标平台(Platform target)设置,STK 9 和 STK 11 有所区别:

  • STK 9 应选择 x86

  • STK 11 应选择 any CPU 并保持 Prefer 32-bit 选项处于未勾选的状态

项目引用选择

Assemblies

设置项目引用时,由于 STK 的可视化控件属于 WinForm 组件,因此对于 .NET FrameworkWPF 应用,STK 9 和 STK 11 均需要在Reference Manager > Assemblies > Framework中勾选以下内容:

  • System.Windows.Forms

  • WindowsFormsIntegration

而对于 .NET Core 应用,只需在 .csproj 文件中添加:

<UseWindowsForms>true</UseWindowsForms>
<LangVersion>12.0</LangVersion>

并修改 TargetFramework 为:

<TargetFramework>net472</TargetFramework>

COM

只有 STK 9 需要设置 COM 引用,在Reference Manager > COM > Type Libraries中勾选以下内容即可:

  • AGI STK Objects 9
  • AGI STK Util 9
  • AGI STK VGT 9
  • AGI STK X 9

Browse

对于 STK 9,除了 COM 引用外,还需在Peference Manager > Browse 中打开STK 9 Install Folder\bin\Primary Interop Assemblies以添加引用以下文件:

  • AGI.STKX.Interop.dll
  • AxAGI.STKX.Interop.dll

对于 STK 11,只需在Peference Manager > Browse 中打开STK 11 Install Folder\bin\Primary Interop Assemblies以添加引用以下文件:

  • AGI.STKX.Controls.Interop.dll

  • AGI.STKXGraphics.Interop.dll

  • AGI.STKUtil.Interop.dll

  • AGI.STKX.Interop.dll

  • AGI.STKVgt.Interop.dll

  • AGI.STKObjects.Interop.dll

引用属性设置

完成全部引用后,必须将上述引用的 全部内容Embed Interop Types 属性设置为 false

抛出异常

原因:程序中第一次实例化AgStkObjectRoot时,若不存在以下内容中的任意一个:

  • AxAgUiAxVOCntrl 控件
  • AxAgUiAx2DCntrl 控件
  • AgSTKXApplication 实例

则会抛出该异常

解决方法:在程序开始时创建AgSTKXApplication实例即可:

1
services.AddSingleton(new AgSTKXApplication());

或:

1
AgSTKXApplication stk_instance = new AgSTKXApplication();

原因:程序开始时AgSTKXApplicationAgStkObjectRoot的实例化必须是单线程的,如果使用异步方式实例化,如:

1
2
3
4
5
await Task.Run(() =>
{
    services.AddSingleton(new AgSTKXApplication());
    services.AddSingleton(new AgStkObjectRoot());
});

则会抛出该异常

解决方法:不使用异步方式实例化

This post is licensed under CC BY 4.0 by the author.