使用Reflection来调用dll中的函数是行不通的

时间:2010-10-05 00:06:10

标签: c# .net reflection ranorex

以下是来自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 !!!!

第一个例外: Message =“调用目标抛出了异常。”

内部异常消息=“请求失败”。 “

DeclaringMethod ='rtsObj.DeclaringMethod'抛出类型'System.InvalidOperationException'的异常

感谢您的帮助。第一次使用反射,对不起的代码抱歉。

编辑#2 !!!

VS的堆栈跟踪:  Saftey Door Simulator.exe!Safety_Door_Simulator.Form1.btnInit_Click(object sender = {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 =“at Oe.RTS.RTSInterface.KillTeraTerm()\ r \ n at 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 个答案:

答案 0 :(得分:5)

使用Assembly.LoadFile(),它加载没有加载上下文的程序集。改为使用LoadFrom()。

异常消息是没有意义的,不是你从.NET框架代码中得到的那种。您需要查看 InnerException 的堆栈跟踪,以了解它的引发位置。