尝试了用离线程序做, dll文件正常加载进去了, api的方法等等无法正常使用(因为没有找到Eplan的实例), 最后选择了进程通讯的方式做的.
我使用的工具
IDE:Visual Studio 2019
框架:.net framework 4.7.2
需要下载个运行时(做离线程序的时候,需要)
目录
说明,创建一个控制台程序(console)
程序结构
调用cmd.exe打开Eplan
文件名CMD.cs
using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace EplConsole
{
public class CMD: IDisposable
{
private Process process;
private string _errMsg;//报警信息
public string ErrMsg
{
get { return _errMsg; }
set { _errMsg = value; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="appName">传入cmd.exe</param>
public CMD(string appName)
{
try
{
process = new Process();
process.StartInfo.FileName = appName;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
}
catch(Exception ex)
{
_errMsg = ex.Message;
}
}
public void Run()
{
process.Start();
}
/// <summary>
/// 执行方法
/// </summary>
/// <param name="excute">填cmd窗口执行操作</param>
/// <returns></returns>
public string Excute(string excute)
{
try
{
process.StandardInput.WriteLine(excute);
process.StandardInput.AutoFlush = true;
process.StandardInput.Close();
return process.StandardOutput.ReadToEnd();
}
catch(Exception ex)
{
_errMsg = ex.Message;
}
return _errMsg;
}
public void Dispose()
{
process.Close();
process.Kill();
}
}
}
上面的代码是对进程类的封装 , 下面的代码示例化上面的类并使用他的执行方法 , 运行eplan软件 (用eplan.exe路径 , 不知道怎么给他传参 , 有会的可以下方评论 . )
下面代码是Program.cs中的一个方法
static void OpenEpl(object o)
{
CMD cMD = new CMD("cmd.exe");
cMD.Run();
cMD.Excute("start \"start\" \"C:\\Program Files\\EPLAN\\Electric P8\\2023.0.3\\Bin\\W3u.exe\"");
cMD.Dispose();
}
调用cmd.exe执行tasklist查看进程PID
这段代码同上面一样
是Program.cs中的一个方法
public string SearchPID(string appName)
{
CMD cMD = new CMD(appName);
cMD.Run();
return cMD.Excute("tasklist /FI \"IMAGENAME eq EPLAN.exe\"");
}
调用cmd.exe执行netstat查看通讯信息
Program.cs中的一个方法
public string SearchNetPort(string appName)
{
CMD cMD = new CMD(appName);
cMD.Run();
return cMD.Excute("netstat -ao");
}
Eplan类(否则连接Eplan,执行Eplan的Action
后期的代码刚开始测试 , 功能加哪还没想好 ; 等下章文章确定 .
using Eplan.EplApi.RemoteClient;
using Eplan.EplApi.Remoting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EplConsole.EplOperations
{
public class EplClientConn : IDisposable
{
EplanRemoteClient m_pClient;
public string ClientResult;//Eplan反馈信息
private static readonly Lazy<EplClientConn> lazy = new Lazy<EplClientConn>(() => new EplClientConn());
public static EplClientConn Instance { get { return lazy.Value; } }
private EplClientConn()
{
m_pClient = new EplanRemoteClient();
}
/// <summary>
/// 连接Eplan
/// </summary>
/// <param name="netPort"></param>
public void EplConn(string netPort)
{
m_pClient.Connect("localhost", netPort);
}
/// <summary>
/// 发送指令给Eplan
/// </summary>
/// <param name="excute"></param>
/// <returns></returns>
public bool EplAction(string excute)
{
bool excuteResult = m_pClient.ExecuteAction(excute);
m_pClient.ResponseArrivedFromEplanServer += OnResponseArrivedHandler;//Eplan信息反馈委托
return excuteResult;
}
public void Dispose()
{
m_pClient.Disconnect();
m_pClient.Dispose();
}
//委托方法
static void OnResponseArrivedHandler(EplanResponse response)
{ //Handle Server response.
Instance.ClientResult = response.Message;
}
}
}
整体代码
Program.cs代码
using Eplan.EplApi.RemoteClient;
using Eplan.EplApi.Remoting;
using EplConsole.EplOperations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace EplConsole
{
class Program
{
static void Main(string[] args)
{
//全局变量
Program program = new Program();
string strPtr = "1";
string srcStr = "1";
string pattern = "1";
string netPort = "1";
//后期更新变量会在这增加
MatchCollection matchs;
Match match;
mainStart:
Console.WriteLine("你希望从第几步开始,请输入以下数字;退出输入Esc-->按回车");
Console.WriteLine("1,打开Eplan软件");
Console.WriteLine("2,查看EplanPID");
Console.WriteLine("3,查看Eplan通讯Port;;;需要先执行第二步,才能正确执行");
Console.WriteLine("4,开始Eplan的操作");
switch (Console.ReadLine())
{
//"1,打开Eplan软件"
case "1":
ThreadPool.QueueUserWorkItem(OpenEpl);//用线程池调用,防止卡线程
break;
//"2,查看EplanPID"
case "2":
srcStr = program.SearchPID("cmd.exe");
//Console.WriteLine(srcStr);
pattern = @"(\w+\.\w+)\s*(\d+)\s{1}\w+";//运用正则表达式,找出进程PID值
matchs = Regex.Matches(srcStr, pattern);
match = matchs[0];
Console.WriteLine("是否显示全部:Y--->显示全部;;;N--->不显示全部");
if (Console.ReadLine()=="y"|| Console.ReadLine() == "Y")
{
foreach (Match match1 in matchs)
{
Console.WriteLine(match1.Value);
}
}
else
{
strPtr = match.Groups[2].Value;
Console.WriteLine("进程名:" + match.Groups[1].Value + "进程PID:" + strPtr);
}
break;
//"3,查看Eplan通讯Port;;;需要先执行第二步,才能正确执行"
case "3":
srcStr = program.SearchNetPort("cmd.exe");
Console.WriteLine(srcStr);
//@"\w+\s*\d+.\d+.\d+.\d+:\d+\s*(\w+:\d)\s*\w+\s*" + strPtr;
pattern = @"\w+\s*\d+.\d+.\d+.\d+:(\d+)\s*\w+:\d\s*\w+\s*" + strPtr;//用正则表达式找出进程通讯值
matchs = Regex.Matches(srcStr, pattern);
match = matchs[0];
netPort = match.Groups[1].Value;
Console.WriteLine("是否显示全部:Y--->显示全部;;;N--->不显示全部");
if (Console.ReadLine() == "y" || Console.ReadLine() == "Y")
{
foreach (Match item in matchs)
{
Console.WriteLine(item.Value);
}
}
else
{
Console.WriteLine("App通讯端口:" + netPort);
}
break;
//"4,连接Eplan,进行进程间通讯,并实现操作"
case "4":
EplClientConn eplClientConn = program.ConnEpl(netPort);
EplOperate:
Console.WriteLine("输入Eplan Action");
program.EplAction(Console.ReadLine());
Console.WriteLine(program.eplClientConn.ClientResult);
Console.WriteLine("输入Esc退回到首选项,其他值继续");
if (Console.ReadLine() == "Esc")
{
program.DispEpl();
goto mainStart;
}
goto EplOperate;
break;
default:
GC.Collect();
break;
}
Console.WriteLine("退出按Esc键;继续按任意键");
if(Console.ReadKey().Key!=ConsoleKey.Escape)
goto mainStart;
}
/// <summary>
/// 1.打开Eplan
/// </summary>
/// <param name="o"></param>
static void OpenEpl(object o)
{
CMD cMD = new CMD("cmd.exe");
cMD.Run();
cMD.Excute("start \"start\" \"C:\\Program Files\\EPLAN\\Electric P8\\2023.0.3\\Bin\\W3u.exe\"");
cMD.Dispose();
}
/// <summary>
/// 2.查看Eplan PID
/// </summary>
/// <param name="appName"></param>
public string SearchPID(string appName)
{
CMD cMD = new CMD(appName);
cMD.Run();
return cMD.Excute("tasklist /FI \"IMAGENAME eq EPLAN.exe\"");
}
/// <summary>
/// 3.查找App通讯端口
/// </summary>
/// <param name="appName"></param>
/// <returns></returns>
public string SearchNetPort(string appName)
{
CMD cMD = new CMD(appName);
cMD.Run();
return cMD.Excute("netstat -ao");
}
/// <summary>
/// 4.连接Eplan
/// </summary>
/// <param name="netPort"></param>
/// <returns></returns>
public EplClientConn ConnEpl(string netPort)
{
eplClientConn = EplClientConn.Instance;
eplClientConn.EplConn(netPort);
return eplClientConn;
}
EplClientConn eplClientConn;
string EplPath = "ProjectOpen /Project:\"C:\\Users\\Public\\EPLAN\\Data\\项目\\Company name\\EplApiTest1.elk\"";
public void EplAction(string excute)
{
eplClientConn.EplAction(excute);
}
/// <summary>
/// 回收Eplan
/// </summary>
/// <param name="eplClientConn"></param>
public void DispEpl()
{
eplClientConn.Dispose();
}
}
}