C#调用COM组件时,经常会遇到Variant类型参数的方法,比如Variant返回值、Variant传入参数等。如果用IDE的工具将COM组件导入为互操作类,则这些类型会被转换为object型,在这里object和COM的variant类型确实很像:表示不确定具体的类型。
一般情况下,解决办法如下:
对于传入参数和引用传递参数(ref参数),调用方(C#代码片段)应该创建正确类型的变量,然后放在参数表对应的位置;
对于传出参数(out参数)和返回参数,声明一个object类型的变量来接收,然后转换为正确的类型;
小弟现在在调用安捷伦示波器时,有一方法是
GetWaveformData ( channel, points, time, data )说明:
channel As Agt54600_AnalogChannels sets the analog channel. (channel为该库自己定义的类型)
points As Agt54600_WaveformPoints sets the number of points contained in Data.
time As Variant returns the time, in seconds, for the x-axis of the waveform data.
data As Variant contains the waveform data.VB编程序
Private Sub ChaiJi(channel As Integer, tmpData As Variant, tmpTime As Variant)
'定义采集过程,参数为通道,数据,时间
Agt54600Scope1.GetWaveformData channel, Points, tmpTime, tmpData
rows = UBound(tmpData, 1)
ReDim data(rows, 1)
' now put the time and volt data into the array of variants
' this is not necessary with the method GetAllWaveformData
For i = 1 To rows
data(i, 0) = tmpTime(i)
data(i, 1) = tmpData(i)
Next i
MSHFlexGrid1.Col = channel
For j = 1 To rows
MSHFlexGrid1.Row = j
MSHFlexGrid1.Text = tmpData(j)
Next j
MSHFlexGrid1.Refresh
'CWGraph1.Plots(2).PlotY dTime1
CWGraph1.Plots(channel).PlotY tmpData
MaxVol = Agt54600Scope1.Measure.MaxVoltage(channel)
Call getFrequence(tmpTime(0), tmpTime(1999) )
End Sub
回传数据的tempTime或者tempDate是数组,VB里直接有VARIENT类型,直接表示tmpTime(0)就行
C#里OBJECT类型,直接表示tmpTime[0]不行??? 我想问的是,用C#,调用该方法:用OBJECT代替VARIENT
public object MY_DATA1;
public object MY_TIME1;
axAgt54600Scope1.GetWaveformData(my_channel, my_point, ref MY_DATA1,ref MY_TIME1);
经过此方法后,我如何将MY_DATA1和MY_TIME1表示成数组形式。或者如何取其中的元素。
一般情况下,解决办法如下:
对于传入参数和引用传递参数(ref参数),调用方(C#代码片段)应该创建正确类型的变量,然后放在参数表对应的位置;
对于传出参数(out参数)和返回参数,声明一个object类型的变量来接收,然后转换为正确的类型;
小弟现在在调用安捷伦示波器时,有一方法是
GetWaveformData ( channel, points, time, data )说明:
channel As Agt54600_AnalogChannels sets the analog channel. (channel为该库自己定义的类型)
points As Agt54600_WaveformPoints sets the number of points contained in Data.
time As Variant returns the time, in seconds, for the x-axis of the waveform data.
data As Variant contains the waveform data.VB编程序
Private Sub ChaiJi(channel As Integer, tmpData As Variant, tmpTime As Variant)
'定义采集过程,参数为通道,数据,时间
Agt54600Scope1.GetWaveformData channel, Points, tmpTime, tmpData
rows = UBound(tmpData, 1)
ReDim data(rows, 1)
' now put the time and volt data into the array of variants
' this is not necessary with the method GetAllWaveformData
For i = 1 To rows
data(i, 0) = tmpTime(i)
data(i, 1) = tmpData(i)
Next i
MSHFlexGrid1.Col = channel
For j = 1 To rows
MSHFlexGrid1.Row = j
MSHFlexGrid1.Text = tmpData(j)
Next j
MSHFlexGrid1.Refresh
'CWGraph1.Plots(2).PlotY dTime1
CWGraph1.Plots(channel).PlotY tmpData
MaxVol = Agt54600Scope1.Measure.MaxVoltage(channel)
Call getFrequence(tmpTime(0), tmpTime(1999) )
End Sub
回传数据的tempTime或者tempDate是数组,VB里直接有VARIENT类型,直接表示tmpTime(0)就行
C#里OBJECT类型,直接表示tmpTime[0]不行??? 我想问的是,用C#,调用该方法:用OBJECT代替VARIENT
public object MY_DATA1;
public object MY_TIME1;
axAgt54600Scope1.GetWaveformData(my_channel, my_point, ref MY_DATA1,ref MY_TIME1);
经过此方法后,我如何将MY_DATA1和MY_TIME1表示成数组形式。或者如何取其中的元素。
应该:
DateTime dt=(DateTime)tmpTime[0]
int i = 123;
object o = (object) i; // boxing 然后,可以对对象 o 取消装箱并将其赋值给整型变量 i:C# 复制代码
o = 123;
i = (int) o; // unboxing
本问题装箱时候应该是从设备回传了一个数组,而且不知道数组元素具体类型。
收到数据后,拆箱就成问题了??按楼上的说法就是:(假设回传的数据是LONG型
long data = (long)MY_DATA1[0];
但是这样依然不对!!