Использование Reflection для вызова функции в DLL не работает - PullRequest
0 голосов
/ 05 октября 2010

Вот код из 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);
            }

        }
    }

1 Ответ

5 голосов
/ 05 октября 2010

Do not использует Assembly.LoadFile (), он загружает сборки без контекста загрузки.Вместо этого используйте LoadFrom ().

Сообщение об исключении довольно бессмысленно, не то, что вы получите из кода .NET Framework.Вам нужно посмотреть на трассировку стека InnerException , чтобы узнать, где он возник.

...