我碰到的问题是使用DllImport导入对应接口使用的时候导致的,因为使用别人生成的dll的时候,大多数情况都是能用就行,对于释放的资源的接口要么就是没有,要么就是不够完美。当然如果你是使用的类库的方式就没这个问题,有标准的托管资源释放的方法。 针对这种DllImport非托管资源的释放,网上说的一般是重构Dispose方法,但是并不起作用,大体形式如下
public void Dispose()
{
// TODO: 添加 DisposeClass.Dispose 实现
Console.WriteLine("dispose object");
GC.SuppressFinalize( this );
}
然后突然想到可以再在dll上封装一层形成独立个体的exe,通过进程id直接释放所有资源,果然完美解决了dll中占用串口的问题 封装成ConsoleApp1.exe
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Thread test = new Thread(() =>
{
ECTOOL tool = new ECTOOL();
int ret = tool.Start();//dll接口
if (-1 == ret)
{
Console.WriteLine("Calibration and Test Fail\r\n");
}
else
{
Console.WriteLine("Calibration and Test Success\r\n");
}
});
test.Start();
while (test.IsAlive)
{
Console.WriteLine("Calibration and Test....\r\n");
Thread.Sleep(1000);
}
}
}
}
调用使用
System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory + "EC_TOOL\\EMAT_OpenAPI_V5.0.0");//dll需要对应目录框架
ProcessStartInfo p = new ProcessStartInfo();
p.FileName = ".\\ConsoleApp1.exe";
//p.WindowStyle = ProcessWindowStyle.Normal;
//p.WindowStyle = ProcessWindowStyle.Hidden;
p.ErrorDialog = false;
p.CreateNoWindow = true;
p.UseShellExecute = false;
p.CreateNoWindow = true;
p.RedirectStandardOutput = true;
p.RedirectStandardInput = true;
p.RedirectStandardError = true;
process[i] = new System.Diagnostics.Process();
process[i]=Process.Start(p);
System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
while (!process[i].HasExited)
{
string output = process[i].StandardOutput.ReadLine();
if (output != null)
{
Console.WriteLine(output);
testUI.userCtlTestWindows.testUtilsArray[i].textBoxLog.AppendText(output + "" + "\r\n");
if (output.Contains("Calibration and Test Success") == true)
{
testUI.userCtlTestWindows.testUtilsArray[i].textBoxLog.AppendText("RF测试成功\r\n");
break;
}
}
之后的测试中,dll接口运行时,随意中止都不会影响串口资源的占用,前提是中止时要 通过进程id关闭进程
Process[] proc = Process.GetProcessesByName("ConsoleApp1");
for (int t = 0; t < proc.Length; t++)
{
if (proc[t] != null)
{
KillProcessAndChildren(proc[t].Id);
}
}
|