如何检索通过Invoke C#返回的Struct

时间:2014-02-13 12:07:23

标签: c# dll struct invoke

我有一个DLL,其中包含一堆类和方法。我正在调用DLL中返回值的方法。如果我试图返回单个值,如字符串或int,这工作正常。 现在我遇到了一种情况,我需要返回一个结构并使用测试工具中结构的值。

其调用的DLL称为WebDriver。

下面是调用调用的代码:

var TestDLL = Assembly.LoadFrom(TestDLLString);
Type myClassType = TestDLL.GetType("SeleniumDPS." + testname);
var instance = Activator.CreateInstance(myClassType);

MethodInfo myResultGetter = myClassType.GetMethod("ReturnResult");

try
{
    myResults = (Results)myResultGetter.Invoke(instance, null);

    teststatus = Results.result;
    testResultFile = Results.testFile;
    StartTime = Results.startTime;
    EndTime = Results.endTime;
    TimeElapsed = Results.timeElapsed;
    TestName = Results.testName;
}

在我的测试工具中,我创建了我的webdriver DLL中的结构的精确副本。 这是:

public struct Results
{
    public static string testName { get; set; }
    public static int result { get; set; }
    public static DateTime startTime { get; set; }
    public static DateTime endTime { get; set; }
    public static TimeSpan timeElapsed { get; set; }
    public static string testFile { get; set; }
}

所以这里我的整体问题是为什么名为myResult的结构与我调用的方法返回的结构具有相同的值? 我已经尝试调试DLL并且它返回结构就像它应该的那样,所以我的假设是它与上面代码的错误。

为了突出我想要做的事情,我试图做的就是检索结构,我真的不想创建多个结构等,我只是想能够使用struct I中包含的数据从方法回来。

所以我玩了代码,如果我这样做:

Object myObject;
myObject = myResultGetter.Invoke(instance, null);

然后,当我在运行时添加myObject时,它包含正确的值!但我需要找到一些方法将这些值放入我的新结构或类中(我不介意使用哪个)

2 个答案:

答案 0 :(得分:0)

您将结果数据存储在静态字段中。基本上,你永远不应该这样做,我想这也引起了这个问题。实际上,您的结构是空的,仅用作静态字段的容器。

我假设您在单独的AppDomain中运行DLL。这个其他AppDomain有自己的一组静态变量,因此AppDomain中使用代码的静态字段保持不变,因此您会觉得不会返回值。

因此,这里的解决方案是简单地将struct属性转换为实例属性(并添加适当的构造函数)。根据通用编码指南,这些属性也应该是只读的。

答案 1 :(得分:0)

好的,所以我为自己想出了这个。

而不是使用:

myResults = (Results)myResultGetter.Invoke(instance, null);

我用过:

object myResults = myResultGetter.Invoke(instance,null);

然后我用反射从对象中“抓取”我需要的值:

int myTestResult = (int)myObject.GetType().GetProperty("result").GetValue(myObject);
string myTestName = (string)myObject.GetType().GetProperty("testName").GetValue(myObject);
DateTime myStartTime = (DateTime)myObject.GetType().GetProperty("startTime").GetValue(myObject);
DateTime myEndTime = (DateTime)myObject.GetType().GetProperty("endTime").GetValue(myObject);
TimeSpan myElapsedTime = (TimeSpan)myObject.GetType().GetProperty("elapsedTime").GetValue(myObject);
string myTestFile = (string)myObject.GetType().GetProperty("testFile").GetValue(myObject);

如果我愿意,我可以使用这些值填充新结构。