最近在学习,设想做一个实现虚拟串口的C#程序,因为我不会写驱动,于是参考老哥的方法,调用VSPD的DLL开放接口进行实现。
从VSPD虚拟COM口安装包解出独立的驱动安装包(虚拟串口开发和EXE程序反解压)
因为调用DLL也是第一次去做,所以出了很多错误,在这里跟大家分享一下。
首先,VSPD的dll不能直接引用。
否则会出现下面那种报错的信息。
正确做法是将DLL放入你的程序文件夹下中的Debug文件夹,让它和你的exe文件在一起。然后在程序里右键重新生成一下。
然后参照VSPD的用户手册(User Manual),与相应的接口(在Using serial port driver in your program下的Functions中),在C#写相应的调用,下面是代码。(此处是拿创建串口的调用做演示。)
[DllImport("vspdctl.dll")]//引用DLL
public static extern bool CreatePair(string comName1, string comName2);
之后调用这个方法。我写的是窗体,所以把方法写在一个Button中。
using static CreatePortDemo.VSPDClass;//注意引用你写接口的类
private void button1_Click(object sender, EventArgs e)
{
try
{
bool IsCrateSeccuss = CreatePair(CreatePortName.Text, CreatePortName2.Text);;//因为接口返回是一个bool值,用一个bool值存储起来是否创建成功
if (IsCrateSeccuss)
{
MessageBox.Show("创建成功");
}
else
{
MessageBox.Show("失败");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
然后调试,然后你又可能出现了下面的问题。
或者是长时间未响应,最后没有报错,但是崩溃退出,输出列表显示:AccessViolationException。
这又是啥异常?我一开始也不知道,因为就连try catch都捕捉不到,后来查了一下。
AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
于是我开始怀疑,是不是我的DLL错误。于是去网上重新下了一个VSPD的DLL,和自己的DLL对比。嗯……新下载的是3000多kb,我的是100多kb。
肯定是我的DLL坏了没跑了。于是我换了dll后,再进行测试后,果然没有报错了。
但是也仅仅是没有报错——不意味着已经解决了!
[DllImport("vspdctl.dll")]//引用DLL
public static extern bool CreatePair(string comName1, string comName2);
我使用了这个创建虚拟串口的功能,如果成功创建则会返回true,如果失败则会返回false。
我利用if else进行编写了一个简单的提示,如果接收到true就提示“成功”,否则就提示“失败”。
结果就是,在测试中,它不断返回了true ,但是串口根本就没有创建出来!
这个情况就像是我叫一个熊孩子去写作业,写好了就告诉我“写好了”,可是他写都不写就告诉我“写好了”。悲愤交加之际,决定睡个午觉。
下午睡醒就突然领悟到,突然想到是不是电脑里的VSPD和新下载的DLL版本不匹配。
于是连忙下载了一样版本的VSPD进行安装。结果一测试,成功了。
怪不得百度上都搜不到,有谁情况跟我一样的。晕!
解决方法:下载一个与DLL匹配的VSPD,DLL要和自己电脑VSPD版本匹配,才能成功使用接口功能。