TestStand - Action Sequence使用c# - Dll - Can't实例化Vector X

本文关键字:Vector 实例化 Can Sequence Action 使用 Dll TestStand | 更新日期: 2023-09-27 18:16:59

因为可能很少有人有TestStand和Vector XLDriver(这里用于汽车CAN总线)的经验,我真的很欣赏有根据的猜测…

TestStand 2014 64Bit

我在一个序列中有一个动作步骤。它使用了c# Dll的一个函数。函数运行完美,但如果我试图在函数之前的类作用域中插入两行之一:

public XLDriver xlDriver = new XLDriver();

private static XLDriver xlDriver = new XLDriver();

在TestStand中不起作用。当从c# Main()调用函数时,后者工作得很好。

在TestStand中,我收到以下
 An exception occurred inside the call to .NET member 'myMember':
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
   bei vxlapi_NET.C_XLapiLoader..ctor()
   bei vxlapi_NET.XLDriver..ctor()
   bei myNameSpace.myClass..ctor() in myFile.cs:Line 27.

短语"Der Objektverweis wurde night auf eine Objektinstanz festgelegt."可以翻译为"对象引用尚未链接到对象实例"。

没有XLDriver行,它在TestStand中工作。在另一个c# Main()中使用它无论如何都可以工作。

vxlapi_NET.dll调用vxlapi.dll或vxlapi64.dll。由于我已经删除了32位版本并再次尝试,vxlapi_NET.dll文件可能不会调用错误的。

如果我在另一个c#项目中使用我的c#,它使用Dll并编译为可执行文件,我可以在TestStand中使用它。它完美地调用了XL Driver。

那么在TestStand序列步骤中使用可执行文件或c# Dll的区别在哪里?

谢谢。

TestStand - Action Sequence使用c# - Dll - Can't实例化Vector X

我重构了vxlapi_NET,问题是在Assembly.GetEntryAssembly()方法中,GetEntryAssembly返回null。

 // Decompiled with JetBrains decompiler
 // Type: vxlapi_NET.C_XLapiLoader
 // Assembly: vxlapi_NET, Version=9.0.0.26263, Culture=neutral, 
  ....   
   namespace vxlapi_NET
   {
     internal class C_XLapiLoader
     {
      private string exeDirectory =  
          Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
  ....

根据。net NUnit测试- Assembly.GetEntryAssembly()为空你可以使用

     /// <summary>
    /// Use as first line in ad hoc tests (needed by XNA specifically)
    /// </summary>
    public static void SetEntryAssembly()
    {
        SetEntryAssembly(Assembly.GetCallingAssembly());
    }
    /// <summary>
    /// Allows setting the Entry Assembly when needed. 
    /// Use AssemblyUtilities.SetEntryAssembly() as first line in XNA ad hoc tests
    /// </summary>
    /// <param name="assembly">Assembly to set as entry assembly</param>
    public static void SetEntryAssembly(Assembly assembly)
    {
        AppDomainManager manager = new AppDomainManager();
        FieldInfo entryAssemblyfield = manager.GetType().GetField("m_entryAssembly", BindingFlags.Instance | BindingFlags.NonPublic);
        entryAssemblyfield.SetValue(manager, assembly);
        AppDomain domain = AppDomain.CurrentDomain;
        FieldInfo domainManagerField = domain.GetType().GetField("_domainManager", BindingFlags.Instance | BindingFlags.NonPublic);
        domainManagerField.SetValue(domain, manager);
    }

 ....
 SetEntryAssembly();
 XLDriver xlDriver = new XLDriver();
 ...