无法在 C# 中使用 RepositoryUtil.dll 读取 TSR 对象存储库

Unable to read a TSR Object repository using RepositoryUtil.dll in C#

我是 C# 和 .net 的新手。我的任务是创建一个 WPF 应用程序 POC,以读取 .tsr 文件中的 QTP 对象存储库,并使用该存储库中的所有对象及其子对象填充 TreeView。

我得到了QTP的RepositoryUtil.dll和下面的示例代码来适配C#:

    Dim i
    Dim ORFile = "D:\TAF\Size.tsr"
    Dim ORObj = CreateObject("Mercury.ObjectRepositoryUtil")

    ORObj.Load(ORFile)

    Dim ObjectCollection = ORObj.GetChildren

    For i = 0 To ObjectCollection.Count - 1

        Dim Obj = ObjectCollection.Item(i)

        Dim temp1 = "" & Obj.GetTOProperty("micclass") & "(""" & ORObj.GetLogicalName(Obj) & """)"


        Dim treeItem = New TreeViewItem

        Dim tNode = New TreeViewItem() With {.Header = temp1}

        treeview1.Items.Add(tNode)

        tNode = treeview1.Items(i)

        Add(ORObj, Obj, tNode)

    Next

现在我对 Visual Basic 不是很熟悉,但是我正尝试在控制台应用程序中按如下方式调整它以检查是否填充了字符串 "title"。

    static void Main(string[] args)
    {
        string ORFilePath = @"D:\TAF\Size.tsr";
        ObjectRepositoryUtil ORUtil = new ObjectRepositoryUtil();
        ORUtil.Load(ORFilePath);
        var ChildObjects = ORUtil.GetChildren();
        for (int i = 0; i < ChildObjects.Count(); i++ )
        {
            var ChildObject = ChildObjects.Item(i);
            string title = ChildObject.GetTOProperty("micclass") + "(\"" + ORUtil.GetLogicalName(ChildObject) + "\")";
            Console.WriteLine(title);
        }
    }

但是当我 运行 这样做时,我在行 "var ChildObjects = ORUtil.GetChildren();"

上得到一个 InvalidCastException: {"Return argument has an invalid type."}

我无法弄清楚什么地方出了问题或 ORUtil.GetChildren() 返回的是什么类型,因为该库没有提供任何文档,而且我在网上找不到任何文档。

那么,谁能告诉我我到底做错了什么以及解决这个问题的正确方法是什么?

编辑:

这是上述异常的堆栈跟踪:

System.InvalidCastException was unhandled
HResult=-2147467262
Message=Return argument has an invalid type.
Source=mscorlib
StackTrace:
   at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType)
   at System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
   at REPOSITORYUTILLib.DispIObjectRepositoryUtil.GetChildren(Object Parent)
   at ORReader.Program.Main(String[] args) in c:\Users\DDDAVID.DDDAVID-IN\Documents\Visual Studio 2013\Projects\ORReader\ORReader\Program.cs:line 17
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
InnerException: 

在一些帮助下,我已经解决了自己的问题。

我想做的是尝试添加 RepositoryUtil.dll 作为参考并调用它的方法。我应该做的是使用以下方法获取 QTP 注册的 ObjectRepositoryUtil 的程序标识符:

Type.GetTypeFromProgID("Mercury.ObjectRepositoryUtil");
dynamic ORUtil = Activator.CreateInstance(ORType);

我修改了如下代码并且成功了。

static void Main(string[] args)
{
    Type ORType = Type.GetTypeFromProgID("Mercury.ObjectRepositoryUtil"); 
    dynamic ORUtil = Activator.CreateInstance(ORType);

    string ORFilePath = @"D:\TAF\Size.tsr";
    //ObjectRepositoryUtil ORUtil = new ObjectRepositoryUtil();
    ORUtil.Load(ORFilePath);
    var ChildObjects = ORUtil.GetChildren();
    for (int i = 0; i < ChildObjects.Count(); i++ )
    {
        var ChildObject = ChildObjects.Item(i);
        string title = ChildObject.GetTOProperty("micclass") + "(\"" + ORUtil.GetLogicalName(ChildObject) + "\")";
        Console.WriteLine(title);
    }
}