C# WPS插件开发流程
<h3>源码</h3><p>教程完整版word和项目源码下载:</p>
<p>https://pan.baidu.com/s/1ufSfrzU5XKlCa9nhyp9tqQ</p>
<h1>一、开发前准备</h1>
<p>1. 操作系统</p>
<p>在Win10系统中引用WPS的dll文件可能会受到系统权限限制的问题,可以尝试在Administrator账户中安装WPS Office 2016专业版及进行后续开发。如果使用Win7系统,比较顺利</p>
<p>2. IDE集成开发环境</p>
<p>Microsoft Visual Studio 2017 Community 社区免费版</p>
<p>3. WPS Office 2016</p>
<ul>
<li>WPS Office 2016专业版。专业版无需**也可进行开发,推荐</li>
<li>WPS Office 2016个人版。个人版需运行专业版自带的WPSOfficePIA.exe注册程序集后方可正常引用WPS的相关DL</li>
</ul>
<h1>二、创建项目</h1>
<p>1. 启动Visual Studio-文件-新建-项目</p>
<p><img src="https://www.freesion.com/images/781/1b2059510ed0f8ea74a02ea017c24d75.JPEG"></p>
<p>2. 已安装→Visual C#-类库(.NET Framework)→输入名称→选择框架→确定</p>
<p><img src="https://www.freesion.com/images/833/c9c1506c0b805e7620ff1c560f411c29.JPEG"></p>
<p>生成的新项目如下图</p>
<p><img src="https://www.freesion.com/images/699/2fe64b3ec344cd813646ecb0c5021813.JPEG"></p>
<p>3. 在解决方案资源管理器中的项目上右键→属性→应用程序→程序集信息</p>
<p><img src="https://www.freesion.com/images/7/04a2274393ba2233bf860eb8ef7a9fef.JPEG"></p>
<p>4. 修改相应信息→勾选“使程序集COM可见”→ 确定</p>
<p><img src="https://www.freesion.com/images/979/32cecea41604c61db2b22efa29eb9e3b.JPEG"></p>
<p>5. 切换到“生成”→勾选“为COM互操作注册”</p>
<p><img src="https://www.freesion.com/images/976/955048e65957579f39583798f37b4a88.JPEG"></p>
<p>6. 切换到“调试”→勾选“启动外部程序”→浏览→找到WPS安装文件夹中的相应exe程序</p>
<p><img src="https://www.freesion.com/images/636/a29b139924742c1d88aa53ca8a534844.JPEG"></p>
<p>7. 切换到“签名”→勾选“为程序集签名”→新建**文件→输入名称→输入密码(也可不输入)→确定后完成项目属性设置</p>
<p><img src="https://www.freesion.com/images/947/ed75efd2bcac2ff8ba9aefb1d819d103.JPEG"></p>
<h1>三、添加引用</h1>
<p>1. 在项目的“引用”上右键→添加引用</p>
<p><img src="https://www.freesion.com/images/389/20c7b50eff6cd5dc6bed84de56999ba5.JPEG"></p>
<p>2. 选中“COM”→勾选“Kingsoft Add-In Designer”</p>
<p><img src="https://www.freesion.com/images/177/0c1eb3af5cf68cc347a7c49d706be0f9.JPEG"></p>
<p>3. 继续勾选“Upgrade WPS Presentation 3.0 Object Library(Beta)”→确定</p>
<p>提示: Upgrade WPS Office 3.0 Object Library对应的是WPS文字、Upgrade WPS Spreadsheets 3.0 Object Library对应的是WPS表格</p>
<p><img src="https://www.freesion.com/images/406/6d7d8c7a27c50366a7873b52f1e81c6e.JPEG"></p>
<p>4. 添加上述两个引用后会自动添加以下引用</p>
<p><img src="https://www.freesion.com/images/422/b614707989a4e2a0ffd9d802b45c5f4e.JPEG"></p>
<p>提示:若添加后提示引用出错,可以尝试的解决方法有:</p>
<ul>
<li>以Administrator账户登录Windows</li>
<li>以管理员身份运行Visual Studio</li>
<li>在Administrator账户中,以管理员身份安装WPS Office</li>
<li>WPS Office个人版需要运行专业版中的 WPSOfficePIA.exe 以注册所引用的程序集</li>
<li>安装WPS Office专业版,安装时WPS会自动注册相关程序集</li>
</ul>
<h1>四、添加资源文件</h1>
<p>1. 在Properties上右键→添加→新建项→找到“资源文件”→输入或保持默认名称→添加</p>
<p><img src="https://www.freesion.com/images/282/0db21e2fa1779baa71438435d363ad6a.JPEG"></p>
<p>2. 在打开的Resource1.resx里→添加资源→添加新文本文件→输入名称→添加</p>
<p><img src="https://www.freesion.com/images/915/aefeed6275da64343c17eaab7718986b.JPEG"></p>
<p>3. 创建文本文件后→在打开的txt里粘贴以下代码</p>
<p><img src="https://www.freesion.com/images/195/b9418e2372efcf5a24fb7afa91874523.JPEG"></p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code><customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="MyTab" label="我的插件" visible="true" insertAfterMso="TabDeveloper">
<group id="Test" label= "组名称">
<button id="Test" label="Hello" onAction="Test" getImage="GetRibbonImage" size="large"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI></code></pre>
<p>说明:</p>
<ul>
<li>tabs表示选项卡,id是“MyTab”,显示的名称是“我的插件”,在“开发工具”选项卡之后插入本选项卡</li>
<li>group表示选项卡中的组,id是“Test”,名称是“组名称”</li>
<li>button表示命令按钮,id是“Test”,名称是“Hello”,回调“Test”事件,从“GetRibbonImage”事件中获取按钮图标,按钮显示大尺寸</li>
<li>Id、Label、onAction、getImage引号中的字符可以自定义,且保证唯一性</li>
</ul>
<p>4. 在Resource1.resx中→添加资源→添加现有文件→选择图标文件</p>
<p><img src="https://www.freesion.com/images/912/725aea7c5f61c3492d1181dd077faae0.JPEG"></p>
<p>添加后的图标会显示在Resource1.resx中</p>
<p><img src="https://www.freesion.com/images/726/5bf427a3138ab4146bb656cfec9d49ae.JPEG"></p>
<p>5. 在Resource1.resx中添加相关资源后,在解决方案资源管理器中会自动生成Resources文件夹以及添加好的资源</p>
<p><img src="https://www.freesion.com/images/974/7e5fee61046b0f773d5b2b3002ed723e.JPEG"></p>
<p>提示:直接在项目所在的Resources文件夹中添加资源是不行的,资源文件并没有与项目产生关联,应该在VS中的Resource1.resx中添加</p>
<h1>五、修改主类</h1>
<p>1. 点击解决方案资源管理器中默认的Class1.cs→输入自己插件的名称→回车后点”是”</p>
<p><img src="https://www.freesion.com/images/927/f8aea5ffac1c7281bc2b40bb1b30cec7.JPEG"></p>
<p>提示:本文以“MyAddin”这个名称为例</p>
<p>2. 在Using别名区添加相关的引用名称</p>
<p><img src="https://www.freesion.com/images/718/25ed08b12fa9ecacafd9b26aec1a9fc6.JPEG"></p>
<div class="hljs-ln-code"> </div>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>using AddInDesignerObjects;
using Office;
using PowerPoint;</code></pre>
<p>3. 在public class MyAddin后面添加调用接口</p>
<p><img src="https://www.freesion.com/images/249/f4d0a94a19cffab86a91437fbbe4b1a1.JPEG"></p>
<pre class="highlighter-prismjs language-csharp prismjs-lines-highlighted"><code>public class MyAddin : IDTExtensibility2, IRibbonExtensibility</code></pre>
<p>4. 鼠标分别置于 IDTExtensibility2和IRibbonExtensibility上→点击黄色小灯泡→实现接口→VS会自动添加相关事件</p>
<p><img src="https://www.freesion.com/images/621/a903a7def11c0dcd8e095ed3daffdab5.JPEG"></p>
<p><img src="https://www.freesion.com/images/335/785524cc858344166510303925ed8647.JPEG"></p>
<p>5. 声明公共静态全局变量app和wpp</p>
<p><img src="https://www.freesion.com/images/560/8aaa0b42405cb684853cd1a38a4be008.JPEG"></p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>public static PowerPoint.Application app = null;
public static object wpp;</code></pre>
<p>6. 在OnConnection事件中初始化wpp和app</p>
<p><img src="https://www.freesion.com/images/532/d0f5b5a24dec52811a9f36156d98c234.JPEG"></p>
<div class="hljs-ln-numbers"> </div>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>wpp = Application;
app = wpp as PowerPoint.Application;</code></pre>
<p>7. 在GetCustomUI事件中调用在Resource1.resx中添加的MyRibbon.txt</p>
<p><img src="https://www.freesion.com/images/298/1e4915d4a2e8e4119554f489ec6b92d2.JPEG"></p>
<pre class="highlighter-prismjs language-csharp prismjs-lines-highlighted"><code>return Properties.Resource1.MyRibbon;</code></pre>
<p>提示:调用资源文件时无需添加具体的扩展名</p>
<p>8. 添加GetRibbonImage事件,用于插件获取按钮图标</p>
<p><img src="https://www.freesion.com/images/328/f07078d86929b403212d472749da6948.JPEG"></p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>public Bitmap GetRibbonImage(IRibbonControl ctrl)
{
switch (ctrl.Id)
{
case "Test":
return Properties.Resource1.OKUI_1;
}
return null;
}</code></pre>
<p>提示:若要给别的按钮添加图标,在GetRibbonImage事件中补充相关代码。这里的Test是Hello按钮的id,OKUI_1是Resource1.resx中图标的名称</p>
<p>9. 鼠标置于Bitmap上→点击黄色小灯泡→点“Using System.Drawing;”,VS会在顶部的Using别名区自动添加相应的Using别名</p>
<p><img src="https://www.freesion.com/images/996/a5711048c82f0e8c60ed6b7984238f94.JPEG"></p>
<p>10. 添加Test事件</p>
<p><img src="https://www.freesion.com/images/379/9f98428c9e8c1949f7d6763c8259ae13.JPEG"></p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code> public void Test(IRibbonControl ctrl)
{
MessageBox.Show("Hello World");
}</code></pre>
<p>提示:MessageBox需要引用System.Windows.Forms。引用方法如下:</p>
<p>(1)在解决方案资源管理器中→在引用上右键→添加引用</p>
<p><img src="https://www.freesion.com/images/687/1c6d356c8d8cc4a24e26a142d2a6a5e7.JPEG"></p>
<p>(2)选中程序集→勾选“System.Windows.Forms”→确定</p>
<p><img src="https://www.freesion.com/images/968/e8315110ce95a0c3a7f199873caab5d0.JPEG"></p>
<p>(3)在Using别名区引用System.Windows.Forms</p>
<p><img src="https://www.freesion.com/images/926/91659ba1bf4ffa08b1ae73346f8e330e.JPEG"></p>
<pre class="highlighter-prismjs language-csharp prismjs-lines-highlighted"><code>using System.Windows.Forms;</code></pre>
<p>(4)波浪线消失,我们可以正常调用消息框了</p>
<p><img src="https://www.freesion.com/images/379/cf77b5f0c2a7a9e0764314430d31d8cb.JPEG"></p>
<p>最后:其它几个事件可为空,也可根据自己需求添加代码。</p>
<h1>六、添加注册表信息</h1>
<p>1. 安装</p>
<p>打开记事本→粘贴以下代码→另存为install.reg→双击install.reg文件安装插件</p>
<p><img src="https://www.freesion.com/images/414/30722bdc4930c46600b570f13ce4b4c6.JPEG"></p>
<div class="hljs-ln-numbers"> </div>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>Windows Registry Editor Version 5.00
"FriendlyName"="友好名称"
"Description"="插件描述"
"LoadBehavior"=dword:00000003
"CommandLineSafe"=dword:00000001
"WPP_test.MyAddin"=""</code></pre>
<p>2. 卸载</p>
<p>打开记事本→粘贴以下代码→另存为uninstall.reg→双击uninstall文件卸载插件</p>
<p><img src="https://www.freesion.com/images/407/bf6106726d4a3e3f92655993098c621f.JPEG"></p>
<div class="hljs-ln-numbers"> </div>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USERSOFTWAREMicrosoftOfficePowerPointAddinsWPP_test.MyAddin]
"WPP_test.MyAddin"=-</code></pre>
<p>说明:</p>
<p>(1)因为开发的是WPS演示的插件,所以注册表路径分别对应的是PowerPoint和WPP</p>
<p><img src="https://www.freesion.com/images/7/b685b6baa856aad221295c860703979f.JPEG"></p>
<p>需要注意的是,无论电脑中有没有安装Microsoft Office,都应这样写</p>
<p>(2)这里的WPP_test是插件项目的名称,MyAddin是插件主类库的名称</p>
<p><img src="https://www.freesion.com/images/425/6c43b81eaca47074b5fd3c1d6f9f0081.JPEG"></p>
<p>(3)若开发的是WPS文字、WPS表格的外接程序,则注册路径中:WPS文字对应的是Word和WPS;WPS表格对应的是Excel和ET</p>
<h1>七、运行</h1>
<p>1. 点击VS中的启动按钮启动wpp.exe</p>
<p><img src="https://www.freesion.com/images/900/817edb87dc783fa0fb9f281226bc79e4.JPEG"></p>
<p>2. 切换到“我的插件”选项卡→点击Hello按钮→弹出对话框→插件的基本创建就完成了</p>
<p><img src="https://www.freesion.com/images/188/bfdd8f45c0627f090a9ee0ab2b3ad1dc.JPEG"></p>
<h1><strong>八、</strong><strong>生成WPS演示所需的PIA</strong></h1>
<p>1. 打开WPS的安装文件夹,找到ksoapi.dll和wppapi.dll,复制到D盘下自己创建的PIA文件夹中,方便后续操作</p>
<p><img src="https://www.freesion.com/images/603/0b1f2f218fdd3343890f7f181a899473.png"></p>
<p>提示:若需要生成WPS文字或WPS表格的PIA,对应的DLL分别是wpsapi.dl或etapi.dlll</p>
<p>2. 在开始菜单中,打开”VS 2017的开发人员命令提示符”</p>
<p><img src="https://www.freesion.com/images/372/d57926965025c7dc16c2a3cd5458b28c.png"></p>
<p>3. 输入cd “D:\PIA”,进入PIA文件夹中</p>
<p><img src="https://www.freesion.com/images/901/88e1d1a726777128e41c2934332f9ffd.png"></p>
<p>4. 输入TlbImp ksoapi.dll (注意是tlbimp)后回车,会在PIA文件夹中生成Office.dll。输入TlbImp wppapi.dll 后回车,会在PIA文件夹中生成PowerPoint.dll</p>
<p><img src="https://www.freesion.com/images/285/679385edc3629fa32330e275c1d54d15.png"></p>
<p>5. 这样我们就得到了Office.dll和PowerPoint.dll两个文件</p>
<p><img src="https://www.freesion.com/images/555/76c022c3e47b3343ef219f7078d7323b.png"></p>
<h1><strong>九、强签名</strong></h1>
<p>如果要将这两个Dll添加到GAC,还需要进行强签名(若用户是WPS专业版则不需要,为了兼容性,推荐进行强签名)。另外,如果项目中引用了第三方<strong>未签名</strong>的dll,则必须进行强签名才能引用</p>
<p>1. 输入<strong>sn -k test.pfx</strong>后回车,生成随机**对</p>
<p><img src="https://www.freesion.com/images/162/62d46ba27f76101c02f24f58075f0dda.png"></p>
<p>提示:此处的test.pfx可以是任意名称,**文件扩展名也可以是.snk</p>
<p>2. 输入<strong>ildasm Office.dll /out:Office.il</strong>后回车,采用<strong>反汇编工具</strong><strong>ildasm</strong>生成中间语言。</p>
<p><img src="https://www.freesion.com/images/930/4566329745570a72a5914bcb9112fcaa.png"></p>
<p>3. 输入<strong>ilasm /dll /res:Office.res /key:test.pfx Office.il /out:Office.dll</strong>后回车,采用<strong>汇编工具</strong><strong>ilasm(注意不要看成ildasm)</strong>重新生成dll</p>
<p><img src="https://www.freesion.com/images/941/7079af47abb8296ce6277fff3052fd95.png"></p>
<p>4. PowerPoint.dll的强签名操作按照步骤2和3类推,输入以下命令</p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>ildasm PowerPoint.dll /out:PowerPoint.il
ilasm /dll /res:PowerPoint.res /key:test.pfx PowerPoint.il/out:PowerPoint.dll</code></pre>
<p>5. 重新生成dll后提示:Operation completed successfully,说明强签名成功</p>
<p><img src="https://www.freesion.com/images/224/a1e8dbd3483df5d66e44d7b3bcf87c20.png"></p>
<p>提示:经过强签名后的dll会覆盖原来未签名的dll</p>
<p>6. 强签名后的Office.dll和PowerPoint.dll</p>
<p><img src="https://www.freesion.com/images/378/3bd6774ae849c6bad71019553a208c2a.png"></p>
<h1><strong>十、部署</strong></h1>
<p>1. 将项目调试由Debug改为Release</p>
<p><img src="https://www.freesion.com/images/896/aa9dbd14571f9dbf55d6a2a6f3a199a0.png"></p>
<p>提示:第一次切换Debug为Release,需要在项目属性中重新设置:生成(为COM互操作注册)、调试(启动外部程序)</p>
<p><img src="https://www.freesion.com/images/132/8d04b193f955101fcf84db8945b2f62c.png"></p>
<p><img src="https://www.freesion.com/images/776/e66abb742f75abaee15b9eff21f80cd8.png"></p>
<p>2. 点启动按钮后关闭WPP,目的是为了让VS生成Release版的项目dll</p>
<p><img src="https://www.freesion.com/images/907/b86d837ac23d6b39114536390650b3eb.png"></p>
<p>3. 在项目上右键,点”在文件资源管理器中打开文件夹”</p>
<p><img src="https://www.freesion.com/images/310/54b0e8abeab7413af7accaa86752fd6e.png"></p>
<p>4. 双击bin文件夹,双击打开Release文件夹,将之前强签名后的dll复制过来</p>
<p><img src="https://www.freesion.com/images/656/4668ac8de78706a55030ab902c793178.png"></p>
<p>5. 将步骤(六)中创建的安装和卸载注册表文件也复制过来</p>
<p><img src="https://www.freesion.com/images/590/17c3b7cac68935add91731ec8a17abae.png"></p>
<p>6. 将NETFX 4.0 Tools文件夹复制过来(该文件夹在项目源码的Release文件夹中有)</p>
<p><img src="https://www.freesion.com/images/345/0f1cddf580448f465fcf978d76810849.png"></p>
<p>7. 在记事本中输入已下代码,另存为”安装.bat”批处理文件</p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>@echo off
@setbaseDir="%cd%"
Echo.
Echo 【1】导入注册表
regedit/s %baseDir%\install.reg
Echo.
Echo 【2】注册类型
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm%baseDir%\WPP_test.dll /tlb:%baseDir%\WPP_test.tlb
Echo.
Echo 【3】添加程序集到GAC
@SETGACUTIL="%baseDir%\NETFX 4.0 Tools\gacutil.exe"
%GACUTIL%-i %baseDir%\WPP_test.dll
%GACUTIL%-i %baseDir%\PowerPoint.dll
%GACUTIL%-i %baseDir%\Office.dll
pause</code></pre>
<p>8. 在记事本中输入以下代码,另存为”卸载.bat”批处理文件</p>
<div class="hljs-ln-numbers"> </div>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>@echo off
@setbaseDir="%cd%"
Echo.
Echo 【1】从缓存中移除程序集
@SETGACUTIL="%baseDir%\NETFX 4.0 Tools\gacutil.exe"
rd /s /QC:\Windows\Microsoft.NET\assembly\GAC_MSIL\WPP_test
rd /s /QC:\Windows\Microsoft.NET\assembly\GAC_MSIL\PowerPoint
rd /s /QC:\Windows\Microsoft.NET\assembly\GAC_MSIL\Office
Echo.
Echo 【2】注销类型
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm/u %baseDir%\WPP_test.dll /tlb:%baseDir%\WPP_test.tlb
Echo.
Echo 【3】清除注册表
regedit/s %baseDir%\uninstall.reg
pause</code></pre>
<p>说明:</p>
<p>(1)%cd%是bat文件当前文件夹路径;RegAsm是程序集注册工具,需要用户先安装Microsoft .Net Framework 4.0;gacutil.exe是全局程序集缓存工具,用户电脑一般没有,所以需要我们将NETFX 4.0 Tools文件夹附带在安装包里</p>
<p>(2)上面的”安装.bat”和”卸载.bat”中均默认注册或移出PowerPoint.dll和Office.dll,如果用户安装了同样也是本文章方法创建的插件,可能会影响其他插件使用。为保险起见,我们可以在”卸载.bat”文件中不要移除C:\Windows\Microsoft.NET\assembly\GAC_MSIL文件夹下的PowerPoint和Office文件夹。即在上方”卸载.bat”代码中去掉下面两句:</p>
<pre class="highlighter-prismjs language-bash prismjs-lines-highlighted"><code>rd /s /QC:\Windows\Microsoft.NET\assembly\GAC_MSIL\PowerPoint
rd /s /QC:\Windows\Microsoft.NET\assembly\GAC_MSIL\Office</code></pre>
<p>9. 将Release文件夹整体拷贝出来,打包发给用户。用户安装时,以管理员身份运行”安装.bat”即可</p>
<p><img src="https://www.freesion.com/images/68/e4015e7568f05975e97c806e0d109884.png"></p>
<p>10. 用户安装失败常见原因</p>
<p>(1) 用户未安装Microsoft .Net Framework 4.0</p>
<p>(2) Win7以上系统,用户未以管理员身份运行安装.bat</p>
<p>(3) 安装文件夹所在路径中有空格,需去掉文件夹路径中的空格</p>
<p>注册表未成功添加插件信息,需要用户手动双击”install.reg”添加插件信息到注册表</p>
<h1>十、源码</h1>
<p>教程完整版word和项目源码下载:</p>
<p>https://pan.baidu.com/s/1ufSfrzU5XKlCa9nhyp9tqQ</p><br><br>
来源:https://www.cnblogs.com/guangzhiruijie/p/17217942.html
頁:
[1]