C# 使用反射调用dll中的函数不起作用
以下是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);
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会容易得多。