Вот код из dll:
public static bool SendCommand(string command)
{
KillTeraTerm();
try
{
SerialPort portToUse = new SerialPort("COM2");
portToUse.Open();
portToUse.WriteLine(command);
portToUse.Close();
StartTeraTerm();
return true;
}
catch
{
return false;
}
}
Вот код, который я использую для ссылки на dll:
Assembly loadedDLL = Assembly.LoadFile(@"G:\PRODUCT VALIDATION GROUP\SOFTWARE VALIDATION\Ranorex Support Files\RTSInterface.dll");
Type rtsObj = loadedDLL.GetType("Oe.RTS.RTSInterface");
Object obj = Activator.CreateInstance(rtsObj);
try
{
rtsObj.InvokeMember("SendCommand", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, obj, new object[] { "startbutton" });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Я знаю, что еще не использую возвращаемое значение ... просто хочу знать, почему это не работает.
EDIT !!!!
Первое исключение:
Сообщение = "Исключение было сгенерировано целью вызова."
Внутреннее сообщение об исключении = "Запрос не выполнен". «
DeclaringMethod = 'rtsObj.DeclaringMethod' вызвал исключение типа 'System.InvalidOperationException'
Спасибо за вашу помощь. Впервые использую отражение, так что извините за изменчивый код.
РЕДАКТИРОВАТЬ # 2 !!!
Трассировка стека от VS:
Saftey Door Simulator.exe! Safety_Door_Simulator.Form1.btnInit_Click (отправитель объекта = {Text = "Initialize"}, System.EventArgs e = {X = 56 Y = 10 Button = Left}) Строка 46
C #
[Внешний код]
Saftey Door Simulator.exe! Safety_Door_Simulator.Program.Main () Строка 17 + 0x1d байт C #
[Внешний код]
РЕДАКТИРОВАТЬ # 3
Внутренняя трассировка стека:
StackTrace = "в Oe.RTS.RTSInterface.KillTeraTerm () \ r \ n в Oe.RTS.RTSInterface.SendCommand (String command)"
Код для KillTeraTerm:
public static void KillTeraTerm()
{
if (Process.GetProcessesByName("ttermpro").Length != 0)
{
Process[] teraTermProcess = Process.GetProcessesByName("ttermpro");
foreach (Process p in teraTermProcess)
{
p.Kill();
Thread.Sleep(1000);
}
}
}