ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: VBA万岁

[求助] VSTO入门问题集

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-28 09:26 | 显示全部楼层
VBA万岁 发表于 2015-12-16 16:36
八、如何用C#实现Excel工作表与外部文件的数据交换?

(一)如何将XML文件的数据导入Excel工作表?

九、C#.NET如何封装类库?

看了如下帖子的第44~45楼的代码及附件,
用示例代码封装一个圆面积和圆柱面积函数的类库

有以下两个疑问:
1、如何封装类库?45楼的附件中封装一个圆面积和圆柱面积函数的类库代码在哪个文件可以看到啊?
2、用封装的方法生成的自定义函数与如下链接帖所示的注册自定义函数有什么区别?或者说,封装的自定义函数需要注册吗?
VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

TA的精华主题

TA的得分主题

发表于 2015-12-28 11:56 来自手机 | 显示全部楼层
VBA万岁 发表于 2015-12-28 09:26
九、C#.NET如何封装类库?

看了如下帖子的第44~45楼的代码及附件,

新建一个类库项目,生成的dll就是了…其他项目想用的话,在项目里面,引用就好了

以我的了解,之所以要注册,其实是因为需要往注册表写入信息…普通的.net程序集都是自包含信息,不需要读写注册表,因为不需要注册

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-28 12:06 | 显示全部楼层
excelhomesnake 发表于 2015-12-28 11:56
新建一个类库项目,生成的dll就是了…其他项目想用的话,在项目里面,引用就好了

以我的了解,之所以 ...

多谢指点!
有空打算再尝试着对183楼的链接帖中45楼的代码及如下链接中的实例进行制作测试:
C#.NET 封装DLL类库方法

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-31 19:50 | 显示全部楼层
VBA万岁 发表于 2015-12-28 12:06
多谢指点!
有空打算再尝试着对183楼的链接帖中45楼的代码及如下链接中的实例进行制作测试:
C#.NET 封 ...

181楼链接中的示例(封装圆、圆柱面积类库)测试成功。
可楼上的链接示例(C#.NET 封装DLL类库方法)的测试却陷入疆局,不知道该如何调用类库——我严格按照链接帖所说的在类库(myFunction)中生成了MySwap.cs、MyMaxCD.cs两个类并复制了其中的代码。然后在另一个项目中添加了类库(myFunction)的引用,并生了第3个文件(MyClient.cs),该文件的代码如下。我打算在一个功能区按钮中调用第3个文件(MyClient.cs),问题是,不知怎样调用,功能区按钮的单击事件代码如何才能输出如下结果:
The result of swap is num1 = 456 and num2 = 123
The MaxCD of 456 and 123 is 3

MyClient.cs代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. using myFunction;

  6. namespace ExcelHelpTaskPane
  7. {
  8.     class MyClient
  9.     {
  10.         public static void Main(string[] args)
  11.         {

  12.             if (args.Length != 2)
  13.             {

  14.                 Console.WriteLine("Usage: MyClient <num1> <num2>");

  15.                 return;

  16.             }

  17.             long num1 = long.Parse(args[0]);

  18.             long num2 = long.Parse(args[1]);

  19.             SwapClass.Swap(ref num1, ref num2);

  20.             // 请注意,文件开头的 using 指令使您得以在编译时使用未限定的类名来引用 DLL 方法

  21.             Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}", num1, num2);

  22.             long maxcd = MaxCDClass.MaxCD(num1, num2);

  23.             Console.WriteLine("The MaxCD of {0} and {1} is {2}", num1, num2, maxcd);

  24.         }
  25.     }
  26. }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-31 21:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

本帖最后由 VBA万岁 于 2015-12-31 21:29 编辑
excelhomesnake 发表于 2015-12-28 11:56
新建一个类库项目,生成的dll就是了…其他项目想用的话,在项目里面,引用就好了

以我的了解,之所以 ...

我按照183楼链接帖试图将MyClient.cs生成可执行文件MyClient.exe,然后打算在功能区按钮中调用这个可执行文件。可在VS命令提示中输入代码"csc /out:MyClient.exe /reference:myFunction.DLL MyClient.cs",回车后,却显示如下出错代码。不知如何解决?或者,还有其它调用类库(myFunction)中MySwap.cs、MyMaxCD.cs两个类输出如下结果(交换参数及求两个整数的最大公约数)的方法代码吗?:The result of swap is num1 = 456 and num2 = 123
The MaxCD of 456 and 123 is 3



22.jpg
21.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-31 21:26 | 显示全部楼层
VBA万岁 发表于 2015-12-31 21:18
我按照183楼链接帖试图将MyClient.cs生成可执行文件MyClient.exe,然后打算在功能区按钮中调用这个可执行 ...

想要实现的功能如下:

22.jpg

TA的精华主题

TA的得分主题

发表于 2015-12-31 21:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2015-12-31 21:18
我按照183楼链接帖试图将MyClient.cs生成可执行文件MyClient.exe,然后打算在功能区按钮中调用这个可执行 ...

不知道你是否有看今天给你的关于cs文件的回复.
这里,你要先明确一下MyClient.cs这个文件是否在你这个vsto项目下的,如果是,就不需要单独编译,因为你编译这个vsto项目,这个cs文件也被编译到这个项目下.如果,这个文件是写在其他的类库项目上,那么,你就要编译那个类库项目,然后在vsto的项目上引用那个编译出来的dll,然后using导入命名空间,这样才可以在vsto项目中使用该类.

简单来说:一个项目需要引用外部项目的程序集(dll或其他项目),就要做两件事情
1,在vs里面,解决方案资源管理器中,引用选择程序集.
2,在你需要使用该库的某个类的时候(就是cs文件啦),把全限定名称打出来(例如:命名空间.类名),或者,先在那个cs文件上方using导入对应的命名空间,这样就可以只写出类名就好了

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-1 10:17 | 显示全部楼层
本帖最后由 VBA万岁 于 2016-1-8 15:40 编辑
excelhomesnake 发表于 2015-12-31 21:34
不知道你是否有看今天给你的关于cs文件的回复.
这里,你要先明确一下MyClient.cs这个文件是否在你这个vst ...

测试成功,代码如下:
  1. using myFunction;

  2. private void button7_Click(object sender, RibbonControlEventArgs e)
  3.         {
  4.             Microsoft.Office.Interop.Excel.Range cel = Globals.ThisAddIn.Application.ActiveCell;
  5.             string[] arrayA = { cel.Cells[-1, 1].text.ToString(), cel.Cells[0, 1].text.ToString() };
  6.             Main(arrayA);
  7.         }
  8.         private static void Main(string[] args)
  9.         {
  10.             Microsoft.Office.Interop.Excel.Range cel = Globals.ThisAddIn.Application.ActiveCell;
  11.             try
  12.             {
  13.                 if (args.Length != 2)
  14.                 {
  15.                     cel.Value = "Usage: MyClient <num1> <num2>";
  16.                     return;
  17.                 }
  18.                 long num1 = long.Parse(args[0]);
  19.                 long num2 = long.Parse(args[1]);

  20.                 SwapClass.Swap(ref num1, ref num2);
  21.                 // 请注意,文件开头的 using 指令使您得以在编译时使用未限定的类名来引用 DLL 方法
  22.                 cel.Cells[2, 1].Value = "The result of swap is num1 = " + num1 + "and num2 =" + num2;
  23.                 long maxcd = MaxCDClass.MaxCD(num1, num2);
  24.                 cel.Cells[3, 1].Value = "The MaxCD of " + num1 + " and " + num2 + " is " + maxcd;
  25.             }
  26.             catch (Exception exception)
  27.             {
  28.                 MessageBox.Show(exception.Message);
  29.             }
  30.         }
复制代码


接下来准备测试下以下教程中的阶乘的自定义函数:
递归方法调用

C#接口作用的深入理解

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-1 10:48 | 显示全部楼层
VBA万岁 发表于 2016-1-1 10:17
测试成功,代码如下:

至此,我对类库的认识如下(不知是否正确):
如果自定义类库函数是工作表函数,则须注册;
若仅用于在C#代码调用(如类、按钮单击事件等调用自定义类库函数),则只需添加引用,并using 类库命名空间即可。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-1 10:56 | 显示全部楼层
VBA万岁 发表于 2016-1-1 10:48
至此,我对类库的认识如下(不知是否正确):
如果自定义类库函数是工作表函数,则须注册;
若仅用于在 ...

附上制作测试源码:
ExcelHelpTaskPane.rar (599.51 KB, 下载次数: 20)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 20:32 , Processed in 0.044707 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表