声明C dll函数

时间:2014-03-24 20:37:57

标签: c vb.net pinvoke

我正在学习为Visual Basic制作DLL,所以我做了这个:

C

中的DLL
// FirstDLL.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "stdio.h"

extern "C"
{
    __declspec(dllexport) int sestej(int a, int b)
    {
        int c;
        c = a + b;
        return c;
    }
}

Visual Basic

Public Class Form1

    Declare Function  sestej Lib "C:\Users\Blaž\Documents\Visual Studio     2013\Projects\FirstDLL\Debug\FirstDLL.dll" (ByVal x As Integer, ByVal y As Integer)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim vnos1, vnos2, izhod As Integer

    vnos1 = Convert.ToDecimal(VnosX.Text)
    vnos2 = Convert.ToDecimal(VnosY.Text)

    sestej(vnos1, vnos2)

    lblvsota.Text = izhod

    End Sub
End Class

当我运行它时,我收到此错误:

  

WindowsApplication2.exe中出现未处理的“System.Runtime.InteropServices.MarshalDirectiveException”类型异常

     

其他信息:PInvoke限制:无法返回变体。

我显然做错了什么但我无法在任何地方找到它。

1 个答案:

答案 0 :(得分:3)

当您在VB函数中省略返回类型时,它被假定为object。由于object映射到本机VARIANT类型,因此可以解释错误。您必须指定返回类型。

我建议您切换到P / invoke,而不是继续DeclareDeclare是如何在VB6中完成的,但P / invoke是.net与非托管代码互操作的方式。你会声明这样的函数:

<DllImport("...\FirstDLL.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function sestej(ByVal a As Integer, _ 
    ByVal b As Integer) As Integer
End Function

这也允许您更正代码中的其他错误。即调用约定不匹配。您的非托管代码使用Cdecl,但使用Declare的VB代码使用StdCall。上面的代码修复了这个。