SDK客户端所有组件源码都是开放的,所以二次开发能实现任何您需要的功能,包括界面修改、软件功能、模块开发、授权系统开发等。 如果您不会编程,没有C#编程基础,您可以联系官方技术支持,我们将根据您的需求为您量身定制任意功能。 如果您有C#编程基础,按照以下步骤,您可以快速获取官方提供的SDK源代码并进行二次开发和使用,也可以基于SDK的模块系统制作自己的独立模块,同时开发过程中遇到任何问题都可以随时联系我们或在讨论组发帖快速获取在线技术支持服务。 本文主要讲解如何快速建立自定义功能模块,该方法无需修改编译SDK即可创建可以被SDK模块系统加载并运行的第三方独立模块。模块完整项目可从底部附件中下载。 第一步:配置开发环境。操作系统要求:windows7 64位以上 下载完成后运行安装,选择安装.NET桌面开发组件和NET Framework 4.6.1 目标包,勾选完成后点击安装即可。  安装完成后,运行Visual Studio,点击文件》》新建项目,若有以下选项即为组件安装成功,否则安装失败需要重新运行安装包并勾选需要安装的组件。 第二步:安装SDK并接入测试设备。第三步:创建模块项目。打开Visual Studio,点击文件》》新建项目,新建一个C#类库。 注意:项目类型必须选择 类库(.Net Framework), 框架必须选择 .Net Framework 4.6.1。
在项目上鼠标右键》》添加》》引用。 点击浏览,选择SDK主程序目录中的“Xky.Core.dll”。 然后点击添加》》确定,将“Xky.Core.dll”引用到项目中。 第四步:编写模块代码。上面的步骤只是新建了一个普通的C#类库,继承“Xky.Core.dll”中的的“XModule”类,实现其中成员才可以被SDK主程序加载和调用。 修改代码,继成XModule,根据提示实现其所有成员,最终代码如下: - using System;
5 v' }2 V0 e' f3 O% A8 V - using System.Collections.Generic;2 _% b4 K( @0 _( f. H' g6 P7 g
- using System.Linq;
$ _4 G# ]* C6 R R0 Z - using System.Text;- Z2 [$ ?$ d* q4 K3 K' g/ w; w
- using System.Threading.Tasks;& r9 |# z( W7 ?$ Q+ ?7 B5 N
v* u( _0 l" m/ A' y- namespace TestModule/ Q3 m# r# q' t/ v5 ]2 q/ C' e: }
- {& q2 m+ m" k( K0 {4 ?
- public class Test : Xky.Core.XModule2 h: u4 v1 ~% R- y5 P4 @9 ?
- {1 `( O6 c% y/ e @( |5 c
- public override string Description()
. S U! V' T' }: i - {
! Y U7 |$ G8 W - return "模块描述";" f$ R3 k% ~% e! g) F2 N0 B# P
- }. a, s/ j( w" Z8 g6 b0 I
0 T* `5 x+ z" l" B" T9 O* r% t- public override byte[] Icon()
9 U z& ]$ z" I U - {
; |& T5 U# H: K0 ~) P8 F5 |, u. Z7 A3 N - throw new NotImplementedException();" b% U6 w- f2 S
- }% U- E* ~9 U, T0 P+ Q% w7 F; {1 w
6 v. u0 I+ {/ ~: m% V+ A$ [- public override bool IsBackground()
/ u" u! A) Y7 ~" h" t( [9 l9 q - {9 R, G) p$ g% t5 f: N* N
- return true;
9 o' n$ p! I2 h, d# T: u& e" _; [ - }' y, L" m- ?: k$ P
9 j7 R! i% ~) t1 w2 b! r- public override string Name()
/ H& _/ K7 C. w+ X S3 Y - {
2 c7 O7 F# {2 T$ m9 h$ q4 m/ w" Y% t9 l - return "模块名称";7 f# O: U- m7 a+ V; `; {
- }; Y7 M$ q, c- p" o( F) p
7 q( C! ]- A% ^$ ^( U* {- public override void Start()
$ |: D) }0 `; ]9 \ - {2 F: d/ | f: }' y& O" S/ f
- Device.ScriptEngine.Toast("提示内容");
; F* `& D% x# s; ? - }3 i1 ^- A8 A0 I5 L, S7 B
- }
7 a1 {- x' r3 ?/ T - }4 N. H. [+ n$ {) x: h
复制代码 由于模块需要设置图标,准备一张正方形(推荐尺寸128*128像素)jpg或png图片,鼠标右键复制然后在项目上右键粘贴。 在图片上右键》》属性,将生成操作改为“嵌入的资源”。 修改模块代码,读取该图片作为模块图标。- using System;
( w6 i4 u$ t% d) N- @7 H0 I3 r0 ~ - using System.Collections.Generic;
; N2 U! T' S$ c: E5 B2 Y, Q - using System.IO;+ A- t" N( ?1 [( k4 ^7 E
- using System.Linq;
, U" X* k7 H1 `/ f- u; b - using System.Reflection;- n0 t9 M% a! K! Q
- using System.Text;
/ E/ _6 X+ W1 L6 L) M0 O Q - using System.Threading.Tasks;" A" x' S. i( k
: B9 l( V. B; J' G6 P- namespace TestModule
6 l* [1 E0 t; \1 d1 g; Z( L0 V - {: [% @' Q% }" I! @
- public class Test : Xky.Core.XModule
4 l s4 K4 }; t) f' R" z' j' G - {" s- u9 x' q4 _
- public override string Description()9 Z X' b2 I( Z
- {
& K( @1 K% l2 A6 p" a) F - return "模块描述";" c! Q$ T( I% q3 W; g: ~
- }
. \& I& L5 z: e6 E" ? - 4 ?5 g' M: n, j9 p" K
- public override byte[] Icon()4 k9 d0 z( a1 {1 r: h
- {
$ T+ r5 ]7 |. a - Assembly myAssembly = Assembly.GetExecutingAssembly();% m1 ^& h: G& v% |, k( s# O
- //注意:路径参数必须和当前模块命名空间一致* P2 t. d2 S; N& B/ I" t6 m- [
- Stream myStream = myAssembly.GetManifestResourceStream("TestModule.icon.png");
; h( ?9 @* q3 ~" X - if (myStream != null)
8 x% ?0 C: j' ] - {& O$ i9 ]# |; h3 I( H2 |
- byte[] bytes = new byte[myStream.Length];
L" W; q& J C! [ - myStream.Read(bytes, 0, bytes.Length);
3 }# n- R M; k2 @4 u( j - return bytes;
$ O$ _- y9 \; z - }
& l- A, @9 R4 ~7 z" ^+ K - else0 C# t1 k' [: [& Z0 Q6 p, S
- {: ?# l/ w, l3 E' ~ ?6 y
- Console.WriteLine("模块图标路径有误,无法加载!");; v u9 \6 s8 i# _
- return null;
0 A# k7 p' w- k - }
% J! [5 [0 c* ?3 v. w - }6 ?: z/ v! K$ @6 [4 ?0 F4 Q* Z
- % L, n: ]( f7 E& U. g7 X% n
- public override bool IsBackground()+ r! z2 A5 g5 N0 f8 |
- {
+ Q$ j& J3 h7 w( P2 g - return true;* a' e1 }# q$ b8 W* g; L" Y7 H1 x; t
- } r8 m; ^$ x/ K1 }" f& ^. D
- 0 j2 D. f7 C6 K
- public override string Name()+ c* Z& @5 T; e2 k
- {
4 N8 k0 ], N7 w4 ?7 f - return "模块名称";
# e! X! C% ]4 B% @+ W* W9 G - }
# ~, w6 o2 `5 n2 u( Y - 4 ^' P1 C4 \. b" j$ B1 B
- public override void Start()
6 j/ I) V% N: e! w/ H5 U - {" O2 o5 I. z4 w5 h2 l6 u5 U
- Device.ScriptEngine.Toast("提示内容");
7 N. p) u2 y) S) T* _ - }
$ E/ }; O( V' ^: v6 S; w. ^, O - }
* e( w7 R6 A k' G5 n/ J - }
" s& W2 `& ^# l& t1 G w
复制代码 第五步:生成并运行模块。在项目上鼠标右键》》属性,将程序集名称和默认命名空间都设置为跟模块代码中的命名空间一样 注意:项目属性的程序集名称、默认命名空间和模块代码中的命名空间、加载图标的路径参数必须一致,否则模块将无法被SDK加载。
在项目上鼠标右键》》重新生成,生成完毕后即可在项目的bin>>debug目录下看到生成出来的模块dll文件。 回到SDK主程序目录的Modules文件夹中,新建一个分组文件夹,例如“我的模块”。 进入“我的模块”文件夹,再次建立一个文件夹用来存放模块dll,例如“测试模块”,并将生成的模块dll文件复制到该目录中。 完成以上操作后,重新启动SDK主程序,即可在右侧的模块面板中看到自己的分组和模块,双击或点击运行即可运行该模块。 如果不想每次修改模块代码重新生成以后都要手动复制到SDK模块目录中,我们可以为模块项目设置生成事件,每次生成成功以后自动复制模块文件到SDK模块目录中。 在模块项目上右键》》属性》》生成事件,设置后期生成事件命令,格式为“xcopy $(TargetPath) 模块文件存放的目录 /y”(注意空格) xcopy $(TargetPath) G:\xky\Xky.Platform\bin\Release\Modules\我的模块\测试模块\ /y这样设置以后,每次修改模块代码,只需要在项目上鼠标右键》》重新生成,然后重启SDK即可直接加载最新模块。 https://static.xky.com/topic/files/4_1559633786252.zip N G/ k% I. b" ?, j1 k
|