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的区别在哪里?
谢谢。
我重构了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();
...