C# 使用反射调用dll中的函数不起作用

C# 使用反射调用dll中的函数不起作用,c#,.net,reflection,ranorex,C#,.net,Reflection,Ranorex,以下是dll中的代码: public static bool SendCommand(string command) { KillTeraTerm(); try { SerialPort portToUse = new SerialPort("COM2"); portToUse.Open(); portToUse.WriteLine(command);

以下是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);
        }
我知道我还没有使用返回值。。。我只是想知道为什么这不起作用

编辑 第一个例外: Message=“调用的目标已引发异常。”

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

DeclaringMethod='rtsObj.DeclaringMethod'引发了类型为'System.InvalidOperationException'的异常

谢谢你的帮助。第一次使用反射,很抱歉代码不稳定

编辑#2!!! 来自VS的堆栈跟踪: 安全门模拟器.exe!安全门模拟器.Form1.btnInit\u单击(对象发送器={Text=“Initialize”},System.EventArgs e={X=56 Y=10 Button=Left})第46行 C# [外部代码] 安全门模拟器.exe!安全门模拟器.Program.Main()行17+0x1d字节C# [外部代码]

编辑#3 内部堆栈跟踪:

StackTrace=“at Oe.RTS.RTSInterface.killeteram()\r\n at Oe.RTS.RTSInterface.SendCommand(字符串命令)”

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);
            }

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

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

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



异常消息是非常没有意义的,不是你从.NET框架代码中得到的那种。您需要查看InnerException的堆栈跟踪,才能知道它是从哪里引发的。

您所说的“不工作”是什么意思?是否正在引发异常,问题是什么?是,正在引发异常。对不起,我应该更详细一些。添加异常的更新ComingUpdate。TargetInvocationException通常由类型初始值设定项(静态构造函数)引发。如果这里是这样,那你就不走运了。不能使用类型初始值设定项失败的类型。您可以添加接收到的异常的完整堆栈跟踪吗?为什么需要使用反射?只要引用DLL并直接使用它的类型。你说的“不工作”是什么意思?是否正在引发异常,问题是什么?是,正在引发异常。对不起,我应该更详细一些。添加异常的更新ComingUpdate。TargetInvocationException通常由类型初始值设定项(静态构造函数)引发。如果这里是这样,那你就不走运了。不能使用类型初始值设定项失败的类型。您可以添加接收到的异常的完整堆栈跟踪吗?为什么需要使用反射?只需引用DLL并直接使用其类型。添加了内部异常堆栈跟踪。好的,读取跟踪。KillTeraTerm引发了一个异常。你比我们更接近该方法的源代码。如果我在引用它时调用它,该方法就会工作。当我使用反射时,它不会。反射和调用另一个静态方法的静态方法是否还缺少其他内容?您注意到我关于LoadFile的警告了吗?使用Debug+Exceptions,勾选抛出复选框以使调试器在exception.com处停止。您需要接受证据的LoadFrom()重载。传递AppDomain.CurrentDomain.Evidence。差不多吧。移动DLL会容易得多。添加了内部异常堆栈跟踪。好吧,读取跟踪。KillTeraTerm引发了一个异常。你比我们更接近该方法的源代码。如果我在引用它时调用它,该方法就会工作。当我使用反射时,它不会。反射和调用另一个静态方法的静态方法是否还缺少其他内容?您注意到我关于LoadFile的警告了吗?使用Debug+Exceptions,勾选抛出复选框以使调试器在exception.com处停止。您需要接受证据的LoadFrom()重载。传递AppDomain.CurrentDomain.Evidence。差不多吧。移动DLL会容易得多。