我已经创建了一个由LabVIEW编译的.NET库,其中包含一个函数,该函数接受数字数组和乘数。此函数将返回一个数组,其中每个数字都已乘以乘数。当在C#中调用该函数时,发现该函数需要一个非零索引数组(
我可以使用C#的
从互联网上的研究来看,似乎.NET不支持非零索引数组类型。我已尝试找到修改LabVIEW程序以生成接受零索引数组的函数的方法,但未成功。
有关如何解决此问题的任何建议吗?
更新1
LabVIEW块图
C#程序
double[*]
)和一个int
作为参数,并返回另一个非零索引数组。我可以使用C#的
Array.CreateInstance()
方法创建非零索引数组。但是,由于所需的数据类型是double[*]
,因此无法将此数组传递到函数中。从互联网上的研究来看,似乎.NET不支持非零索引数组类型。我已尝试找到修改LabVIEW程序以生成接受零索引数组的函数的方法,但未成功。
有关如何解决此问题的任何建议吗?
更新1
LabVIEW块图
![LabVIEW block diagram](https://istack.dev59.com/NofJB.gif)
const int Length = 5;
const int LowerBound = 1;
// Instanstiate a non-zero indexed array. The array is one-dimensional and
// has size specified by Length and lower bound specified by LowerBound.
Array numbers = Array.CreateInstance(typeof(double), new int[] { Length }, new int[] { LowerBound });
// Initialize the array.
for (int i = numbers.GetLowerBound(0); i <= numbers.GetUpperBound(0); i++)
{
numbers.SetValue(i, i);
}
var variable = LabVIEWExports.Multiply(numbers, 2); // This is invalid as numbers is not typed double[*].
Console.ReadKey();
LabVIEW函数在C#中的签名
更新2
尝试使用C#的反射调用LabVIEW函数,但遇到了TargetInvocationException
异常。
const int Length = 5;
const int LowerBound = 1;
const string methodName = "MultiplyArray";
const string path = @"C:\";
Array numbers = Array.CreateInstance(typeof(double), new int[] { Length }, new int[] { LowerBound });
for (int i = numbers.GetLowerBound(0); i <= numbers.GetUpperBound(0); i++)
{
numbers.SetValue(i, i);
}
Assembly asm = Assembly.LoadFile(path + "LabVIEW.Interop.dll");
Type type = asm.GetType("LabVIEW.Interop.LabVIEWInteropExports");
if (type != null)
{
MethodInfo methodInfo = type.GetMethod(methodName);
if (methodInfo != null)
{
object result = methodInfo.Invoke(methodInfo, new object[] { array, multiplicand }); // Throw exception.
}
}
Console.ReadKey();
内部异常消息
无法将类型为 'System.Double[*]' 的对象转换为类型 'System.Double[]'。
内部异常堆栈跟踪
在 NationalInstruments.LabVIEW.Interop.DataMarshal.InitMarshalArrayIn(IntPtr data, Array array, Marshal1DArray val) 中,
at LabVIEW.Interop.LabVIEWInteropExports.MultiplyArray(Double[*] input__32Array, Int32 numeric)
在执行过程中,程序似乎尝试使用LabVIEW附带的程序集中的InitMarshalArrayIn()
函数将类型为double[*]
的数据转换为double[]
。
double[*]
是一种类型为double
的非零索引数组。https://social.msdn.microsoft.com/Forums/en-US/e6f84f77-1a09-4dd9-a2af-eb3a54e9c7bc/array-question-single-dimension-array-with-nonzero-lower-bound?forum=csharplanguage - Noctis Tong