在写这个winform程序之前,我还有点小疑惑,winform怎么跟web交互?可能是因为我太久没接触winform了,废话不多说直接进入主题。
js与C#交互很简单,在网上搜一下一大堆,不过为了方便还是在这里说一下:
//web端
function GetWinForm(message)
{
alert(message);
}
javascript访问C#代码
// C# winform端 ,页面使用webBrowser控件 (此处代码来自:https://www.jb51.net/article/66433.htm,略有改动)
// 只需加入[System.Runtime.InteropServices.ComVisible(true)]和 this.webBrowser1.ObjectForScripting = this; 即可被web端中js访问到。
[System.Runtime.InteropServices.ComVisible(
true
)]
public
partial
class
Form1 : Form
{
public
Form1()
{
InitializeComponent();
this
.webBrowser1.ObjectForScripting =
this
;
}
public
void
MyMessageBox
(
string
message)
{
MessageBox.Show(message);
}
private
void
button1_Click(
object
sender, EventArgs e)
{
HtmlElement searchWords = webBrowser1.Document.All["name"];
//获取web端页面元素对象对应属性值
var value = searchWords.GetAttribute("value");
//调用html页面的JS函数来传参数和运行winForm下的函数
webBrowser1.Document.InvokeScript(
"GetWinForm", "ss"
);
}
}
接下来说一下使用BarTender这个软件的遇到的问题:
WinForm集成BarTender报错:
检索 COM 类工厂中 CLSID 为 {8786AEA4-17EC-11D1-8AD8-006097D76312} 的组件失败,
原因是出现以下错误: 80070005 拒绝访问。(异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))。
解决方案如下:
IIS应用程序池中-->高级设置-->标识-->选择NetworkService用户(仅限x64位BarTender,x32位自动创建好了iis及自动配值了权限,应该是在安装时与是否创建了用户有关)
winform引用BarTender的dll,using Seagull.BarTender.Print; 在安装目录下SDK文件中的第一个文件夹中。
下面直接贴实现代码:(需要注意在web传对象时,需要json格式化,传集合时需要先json格式对象在push,然后传输是拼接上"["+obj+"]",但是运行时会报错,JSON未定义,因为winform是IE8的内核,不支持这个JSON对象,需要在web端直接引用json2.js文件)
public class GlobalMod
{
public static bool _blSwicth = false;
public static Engine btEngine;
public static LabelFormatDocument btFormat;
public static System.Timers.Timer RunTime = new System.Timers.Timer(500);
public static string _Path = ConfigurationManager.AppSettings["Path"].ToString();
}
方法体:
public void ClickPrint(string obj)
{
JavaScriptSerializer js = new JavaScriptSerializer();
List>(obj);
if (GlobalMod.btFormat != null && GlobalMod.btFormat.Status == LabelFormat.LabelStatus.Loaded)
{
GlobalMod.btFormat.Close(SaveOptions.DoNotSaveChanges);//不保存模板更改
}
//由于在调用开起打印时会有一段延时,所以此段代码块移至页面加载事件中完成
//GlobalMod.btEngine = new Engine(true);
//GlobalMod.btEngine.Start();
GlobalMod.btFormat = GlobalMod.btEngine.Documents.Open(GlobalMod._Path);
GlobalMod._blSwicth = true;
foreach (var item in itemmsts)
{
PrintJob(null, null, item);
}
}
}