尝试通过引用传递结构时“使用未分配的局部变量”

时间:2012-07-02 19:31:37

标签: c# vb.net struct arguments pass-by-reference

我有一个VB类库,我是从现有的VB类构建的,它包装了一个非托管的DLL。 VB类库包含DLL函数以及与DLL函数相关的各种结构和类型。

我在C#项目中使用类lib,类lib中的一个函数要求我传递一个struct作为参数。这就是我遇到麻烦的地方。

这是DLL的VB代码:

Declare Auto Function CtSetVRegister Lib "Ctccom32v2.dll" _
        (ByVal ConnectID As Integer, ByRef Storage As CT_VARIANT) As Integer

这是VB结构:

<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Public Structure CT_VARIANT
    Dim vRegister As Integer          'Variant Register desired
    Dim type As Integer               'Format want results returned in
    Dim precision As Integer          'Precision desired for floating point conversions
    Dim flags As Integer              'Specially defined flags, 0 for normal, (indirection, etc.)
    Dim cmd As Integer                'Special commands, 0 for normal operation
    Dim taskHandle As Integer         'Alternate task handle for local task register access, 0 = default public
    Dim slength As Integer            'Length of bytes returned in stringVar, not include null
    Dim indexCol As Integer             'Column (X) selection, base 0
    Dim indexRow As Integer             'Row (X) selection base 0
    Dim IntegerIntVar As Integer         '32 bit signed integer storage
    Dim FloatVar As Single         '32 bit float
    Dim DoubleVar As Double        '64 bit double in Microsoft format
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=223)> _
    Public stringVar() As Byte         'null terminated ASCII string of bytes (1 to 224)
End Structure

我写的C#方法要求我在struct中设置必要的值,然后将它们传递给DLL函数:

private void btnWriteVReg_Click(object sender, System.EventArgs e) 
{
        int results;
        CTC_Lib.Ctccom32v2.CT_VARIANT Var;            
        Var.vRegister = int.Parse(txtVRegToRead.Text);
        Var.cmd = 0;
        Var.flags = 0;
        Var.FloatVar = 0;
        Var.IntegerIntVar = 0;
        Var.DoubleVar = 0;            
        Var.precision = 6;            
        writeStatus.Text = "";

        Var.type = CTC_Lib.Ctccom32v2.CT_VARIANT_INTEGER;
        Var.IntegerIntVar = Convert.ToInt32(txtVRegVal.Text);            

        Var.taskHandle = 0;
        results = CTC_Lib.Ctccom32v2.CtSetVRegister(CTconnection,ref Var);
        if ((results == SUCCESS)) 
        {
            writeStatus.Text = "SUCCESS";
        }
        else 
        {
            writeStatus.Text = "ERROR";
        }
    }

我收到错误:

  

使用未分配的局部变量'Var'

我对如何正确地将结构'Var'传递给VB类库感到困惑。

2 个答案:

答案 0 :(得分:1)

init变量

CTC_Lib.Ctccom32v2.CT_VARIANT Var = new CTC_Lib.Ctccom32v2.CT_VARIANT();

答案 1 :(得分:0)

你必须创建Var的实例,

CTC_Lib.Ctccom32v2.CT_VARIANT Var = new CTC_Lib.Ctccom32v2.CT_VARIANT();