我正在学习为Visual Basic制作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;
}
}
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限制:无法返回变体。
我显然做错了什么但我无法在任何地方找到它。
答案 0 :(得分:3)
当您在VB函数中省略返回类型时,它被假定为object
。由于object
映射到本机VARIANT
类型,因此可以解释错误。您必须指定返回类型。
我建议您切换到P / invoke,而不是继续Declare
。 Declare
是如何在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
。上面的代码修复了这个。