无法访问/转换System.Double [*]对象

时间:2017-08-24 16:57:22

标签: c# arrays pinvoke com-interop

我使用界面访问旧应用程序。从这个应用程序我有一些我无法访问的“双数组”。返回类型被声明为虚拟动态。每当我访问数组时,我都会遇到异常。

this question上我发现可能是因为索引数组错误了。所以我尝试了所提出的解决方案,但正如我所说,我甚至无法访问数组而没有获得异常。

有关错误可能是什么的任何想法?

汉斯方法的代码:

var dataSetValues = dataSet.DoubleArray;
var result = ConvertDoubleArray(dataSetValues); // <<<<<< This is where I get an exception

public static double[] ConvertDoubleArray(Array arr)
{
    if (arr.Rank != 1) 
        throw new ArgumentException();

    var retval = new double[arr.GetLength(0)];
    for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix)
        retval[ix - arr.GetLowerBound(0)] = (double) arr.GetValue(ix);
    return retval;
}

DoubleArray的接口声明:

public virtual dynamic DoubleArray { get; set; }

运行时类型信息: enter image description here

例外:

  

System.InvalidCastException:无法转换类型的对象   'System.Double [*]'输入'System.Double []'。在   CallSite.Target(Closure,CallSite,VirtualEnvironmentManager,   对象)在   System.Dynamic.UpdateDelegates.UpdateAndExecute2 [T0,T1,TRET](调用点   site,T0 arg0,T1 arg1)at   FormulaTestExecutor.Common.VirtualEnvironmentManager.CreateVirtualStructure(公式   公式)   d:\开发\ TFS \ MAIN \工具\ FormulaMTest \ FormulaTestExecutor \ FormulaTestExecutor \ COMMON \ VirtualEnvironmentManager.cs:行   55

异常的Stacktrace:

  
    

FormulaTestExecutor.exe!FormulaTestExecutor.Common.VirtualEnvironmentManager.CreateVirtualStructure(FormulaTestExecutor.Model.Formula formula = {FormulaTestExecutor.Model.Formula})第55行C#符号已加载。         FormulaTestExecutor.exe!FormulaTestExecutor.Program.Main(string [] args = {string [0]})第18行C#符号已加载。

  

2 个答案:

答案 0 :(得分:3)

你必须这样做:

var dataSetValues = dataSet.DoubleArray; // dataSetValues is dynamic
var result = ConvertDoubleArray((Array)(object)dataSetValues);

原因是&#39;动态&#39; DoubleArray的类型(可能是在添加COM引用时在界面中自动定义的)。它是super smart thing尝试自行完成从System.Double[*]System.Double[]的转换,但它不够智能(它不能这样做)阅读StackOverflow答案......但是)

所以,你必须要求它只是传递对象&#39;,以便能够将它直接传递给CLR低级别转换,这可以做System.Double [*]到阵列没有崩溃。获得数组后,可以重新使用ConvertDoubleArray实用程序。

答案 1 :(得分:0)

实际上我找到了一个解决方案: Unable to cast object of type 'System.Single[*]' to type 'System.Single[]'

如果我想要转换安全数组,我首先需要将其转换为.NET对象,然后才能将其转换为数组。

var dataSetValues = (Array)(object)dataSetDoubleArray;