我有一个用 VC++6 编写的旧 ocx (spectrograph.ocx)。它包含一个名为 AppendDataX() 的方法,定义如下:
afx_msg void AppendDataX(float FAR* data, long n, float xpos);
我正在尝试使用这个旧的 ocx 控件编写一个新的 C#.NET win32 应用程序。我使用了以下命令,
AxImp spectrograph.ocx
生成 AxSPECTROGRAPHLib.dll。我可以将控件(通过新创建的 .dll)导入到我的 IDE (SharpDevelop) 中,在那里我可以像任何其他控件一样将其添加到表单中。到目前为止一切顺利,直到我尝试将 float[] 传递给 ocx 方法 AppendDataX():
FileStream tw = new FileStream("XX-YY-ZZZZ.2011.01.10.15.52.00.spec", FileMode.Open);
BinaryReader br = new BinaryReader(tw);
int pixelCnt = br.ReadInt32();
float[] wavelength = new float[pixelCnt];
for (int i=0; i<pixelCnt; i++)
wavelength[i] = br.ReadSingle();
bool eof = false;
float temp;
float[] spectrum = new float[pixelCnt];
while(!eof)
{
try
{
temp = br.ReadSingle();
for (int i=0; i<pixelCnt; i++)
spectrum[i] = br.ReadSingle();
spec.AppendDataX(spectrum, pixelCnt, temp);
}
catch(EndOfStreamException)
{
eof = true;
}
}
tw.Close();
这会在编译期间生成以下错误:
Argument '1': cannot convert from 'float[]' to 'ref float' (CS1503)
我使用了 MSIL 反汇编程序来生成 AxSPECTROGRAPHLib.il,我得到了这个:
.method public hidebysig newslot virtual
instance void AppendDataX(float32& data,
int32 n,
float32 xPos) cil managed
{
// Code size 35 (0x23)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld class [SPECTROGRAPHLib]SPECTROGRAPHLib._DSpectrograph AxSPECTROGRAPHLib.AxSpectrograph::ocx
IL_0006: brtrue.s IL_0014
IL_0008: ldstr "AppendDataX"
IL_000d: ldc.i4.0
IL_000e: newobj instance void [System.Windows.Forms]System.Windows.Forms.AxHost/InvalidActiveXStateException::.ctor(string,
valuetype [System.Windows.Forms]System.Windows.Forms.AxHost/ActiveXInvokeKind)
IL_0013: throw
IL_0014: ldarg.0
IL_0015: ldfld class [SPECTROGRAPHLib]SPECTROGRAPHLib._DSpectrograph AxSPECTROGRAPHLib.AxSpectrograph::ocx
IL_001a: ldarg.1
IL_001b: ldarg.2
IL_001c: ldarg.3
IL_001d: callvirt instance void [SPECTROGRAPHLib]SPECTROGRAPHLib._DSpectrograph::AppendDataX(float32&,
int32,
float32)
IL_0022: ret
} // end of method AxSpectrograph::AppendDataX
我一直在搜索和搜索一个简单的示例,该示例显示从 c# 的 float[] 编组到 vc6++ ocx,但我还没有找到适合我的示例。任何人都可以帮助我朝着正确的方向前进......我觉得我在正确的轨道上,这真的不应该这么难,但我觉得我看了几天后就被困住了.