在使用visual studio创建项目时,网站主体使用Web Application创建,部分功能使用WinForm窗体搭建。当时认为都是基于vs平台开发的项目,项目之间相互引用会很容易,但是实际上,web页面由于采用b/s架构,和WinForm架构不兼容,理论上是不允许web调用winform的。所以作为初学者想给大家分享一下我的解决方案。
在web里调用winform,实际是在web页面里调用WinForm.exe这个位于本地的可执行文件,通过注册表调用这个.exe文件实现目标。文件在用户存放winform项目的bin目录里,如我的存放路径是这样子的“C:\Users\source\repos\winform窗体\winform窗体\bin\Debug”。
第一步:创建一个txt文本,进行注册表生成指令编辑。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AnmCAD]
@="AnmCADProtocol"
"URL Protocol"="C:\\Users\\source\\repos\\winform窗体\\winform窗体\\bin\\Debug\\winform窗体.exe"
[HKEY_CLASSES_ROOT\AnmCAD\DefaultIcon]
@="C:\\Users\\source\\repos\\winform窗体\\winform窗体\\bin\\Debug\\winform窗体.exe,1"
[HKEY_CLASSES_ROOT\AnmCAD\shell]
[HKEY_CLASSES_ROOT\AnmCAD\shell\open]
[HKEY_CLASSES_ROOT\AnmCAD\shell\open\command]
@="\"C:\\Users\\source\\repos\\winform窗体\\winform窗体\\bin\\Debug\\winform窗体.exe\" \"%1\""
大概解释一下代码,HKEY就是在注册表里生成的文件夹顺序(如果要删除注册表已添加的事件,只需在HKEY前写一个减号即可),C:...路径是.exe项目在计算机中存储的绝对路径,要注意,这里的分割符不同于在文件夹复制的地址,是两个\\。AnmCAD是这个指令的名字。一会在web调用时会用到,可以按自己喜好去写。写完后更改文档后缀名为.reg,双击执行文件。可以在注册表编辑器中看到文件已经生成。
注意:这里有一个小的问题,因为我的绝对路径里含有中文命名的文件,在编译中可能会出现汉字乱码导致无法正确指向可执行文件 ,所以最好检查一下数据部分是否和写入的一样。如果不一样直接复制刚才写的绝对路径,右键默认点击修改粘贴进去。
第二步:在web中引用刚才生成的注册信息来调用exe文件
(1)<a href="AnmCAD://">调用AnmCAD</a>
直接在前端使用该语句调用,://一定要加这个符号才行。
(2)rocessStartInfo startInfo = new ProcessStartInfo("AnmCAD://");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;//设置窗体打开尺寸为最小号
Process.Start(startInfo);//打开事件AnmCAD
使用button控件触发后端事件,上述为后端代码,进行调用。
点击后浏览器显示如上弹窗,点击打开即可完成调用。
总结,在网页中打开本地可执行程序是一种危险行为,所以这种方法要限制使用,测试中Microsoft 自带浏览器可以执行调用操作,如果还有更好的方法也可以评论区一起讨论,本文采用的方法来自多个CSDN博客,具体实现的时候很混乱没有记清是哪个博主的文章请见谅,只是总结一个可用的结果分享出来。入门小白分享的方法,有不足之处敬请批评指正。