c#WinForm程序调用vsto动态库,已解决
最近做一个vsto的项目,涉及到Form程序调用vsto动态库,弄了半天,搜了很多资料终于搞定了,把积累写下来备以后用。
相关网址:
Demo:
1. 建立一个word外接程序(addin)
我的demo建的是WordVSTOTest工程,建好以后在addin.cs文件中添加一个类变量和一个函数。这个函数是必须的。
namespace WordVSTOTest
{
public partial class ThisAddIn
{
private AddinUtilities addinUtilities;
protected override object RequestComAddInAutomationService()
{
if (addinUtilities == null)
{
addinUtilities = new AddinUtilities();
}
return addinUtilities;
} }
}
注意到AddinUtilities 没有定义,是的,这是个自定义类,名字随便,但要保持一致,里面要封装你要导出的供外部调用的函数。
2. 添加一个类
demo的类名叫AddinUtilities,添加如下代码:
using System.Runtime.InteropServices;
namespace WordVSTOTest
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IAddinUtilities
{
void test();
} [ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddinUtilities : StandardOleMarshalObject, IAddinUtilities
{
void test()
{
MessageBox.Show("Hello World");
}
}
}
这里定义一个接口类型,接口类型里面的函数就是要导出供外部调用的函数,需要什么函数就些什么函数,和普通函数无区别,然后我们的AddinUtilities类要继承这个接口,最后依次实现定义的函数就可以了。我这里是导出了test函数,简单弹个框。
3. 编译
这个编译需要设置一下,不然会有很多莫名其妙的错误,首先vs要用管理员启动,然后转到工程属性-->build,在“输出”栏有个
“为COM互操作注册”的复选框,要勾选这个,最后编译。编译过程中如果要提示还有类似没有注册的错误,要用regasm.exe
注册一下就行了。电脑里搜索到regasm.exe所在的目录,cmd下转到该目录,使用命令:regasm.exe dll绝对路径 /参数。
编译好的dll要在winForm工程里面使用。
好了vsto这边的工作就做完了,下面转到我们的Form测试工程。
4. 建立一个WinForm工程
Demo为WinFormTest工程,建好以后,在form上拖一个button控件,双击button直接转到click函数处:写入一下代码:
public Word.Application app;
public IAddinUtilities utils;
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
app = new Word.Application();
string str = app.Name; app.Visible = false;
object addinName = "WordVSTOTest";
COMAddIn addin = app.COMAddIns.Item(ref addinName); utils = (IAddinUtilities)addin.Object;
utils.test(); //如果没有这个Quit的话,任务管理器的WINWORD.exe不会退出,越来越多。
((Word._Application)app).Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);
}
注意工程需要using以下几项:
using WordVSTOTest;
using Word = Microsoft.Office.Interop.Word;
using Microsoft.Office.Core;
引入这些后才可以编译通过。
简单看一下工程截图:

查看运行结果:

5. 结束。
理解这个调用过程还需要对COM有所了解,不明白原理,抄来抄去到时候出现bug也难排查,就到这里吧。
c#WinForm程序调用vsto动态库,已解决的更多相关文章
- 应用程序调用dll动态库,参数有vector时崩溃的问题
引用:http://blog.csdn.net/guoliushui/article/details/43017339 今天跟同事遇到了一个问题,问题背景: 一个动态库Tst.dll: 一个应用程序A ...
- C#总结(四)调用C++动态库
由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序.在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题.最近一直在和C++ 打交道,C# 怎么调用C+ ...
- c#调用c++动态库的一些理解
调用c++动态库一般我们这样写 [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] ...
- C#调用C++动态库(dll)
在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...
- C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service
一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...
- python调用.net动态库
# python调用.net动态库 ### pythonnet简介------------------------------ pythonnet是cpython的扩展- pythonnet提供了cp ...
- Delphi XE7调用C++动态库出现乱码问题回顾
事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致.以下是解决问题的过程: 我们C++中间件动态库 ...
- 使用ctypes在Python中调用C++动态库
使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...
- JNI_Android项目中调用.so动态库
JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...
随机推荐
- CSS:Stacking Context
通常情况下,HTML页面可以被认为是二维的,因为文本,图像和其他元素被排列在页面上而不重叠.在这种情况下,只有一个渲染进程,所有元素都知道其他元素所占用的空间.z-index属性可让你在渲染内容时调整 ...
- 自从阿里买了Flink母公司以后,你不懂Flink就out了!
个免费报名权限 Ps:小助理手动给大家发送资料,精力有限,仅限前100名免费领取,这份资料对于想要提升大数据技能进阶的小伙伴来说,将会是一份不可或缺的宝贵资料. 特别感谢飞总的部分原创支持!
- Swift与OC混合开发
一.Swift调用OC 1. 创建{targetName}-Bridging-Header.h头文件,在BuildSetting -> bridging 2. Swift文件调用的OC中的类的头 ...
- mysql数据库 --表操作
一.表与表之间建关系 (1) 将所有的数据放在一张表内的弊端 表的组织结构不清晰 浪费存储时间 可扩展性极差 ---> 类似于将所有的代码写入到一个py文件中 -->解耦部分 (2) 如何 ...
- 将Java和Javac的命令在控制台的输出重定向到txt文件
当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...
- xxd - 以十六进制形式表示
总览 (SYNOPSIS) xxd -h[elp] xxd [options] [infile [outfile]] xxd -r[evert] [options] [infile [outfile] ...
- 从零开始搭建系统2.1——Nexus安装及配置
在安装配置Nexus时,请先确定您已经配置好jdk 1.创建目录 2.下载安装包 [root@localhost usr]# cd nexus 下载地址:https://www.sonatype.co ...
- 关于print()里面的sep和end参数的使用
print('hello', 'world') #默认用空格隔开 #hello world print('hello', 'world', sep='wuli') #sep=''可以用来设置连接的字符 ...
- Dubbo中有哪些角色?
registry 注册中心. 是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服务总线的. 发布 开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开. 订阅 客户端程 ...
- filter的使用场景
1.filter的使用场景:假如有一个对象数组A,获取数组中的指定类型的对象放到B数组中 我们在ES5先进行for循环遍历数组,再进行if 判断,如果数组中某个对象的类型符合要求,push 到一个新数 ...