我想从我的vb.net项目调用c ++函数,我正在尝试创建一个dll来执行此操作。我之前从未尝试过这样根据我读到的指南我创建了一个dll.dll(在Visual Studio中使用C ++与dll.def文件,我尝试将其链接到我的VB项目。虽然我可以在没有任何错误的情况下构建它,但是我会得到它
'System.Runtime.InteropServices.MarshalDirectiveException'
其他信息:PInvoke限制:无法返回变体。
我的代码是:
dll.h
#define WDL_API __declspec(dllexport)
extern "C" WDL_API int __stdcall wdl(void);
dll.cpp
#include "stdafx.h"
#include "dll.h"
#include <stdio.h>
#include <windows.h>
char var[] = {"a"};
extern "C" WDL_API int __stdcall wdl(void)
{
int i, len1 = sizeof(var);
char sName[100], sAns[10];
FILE *ptr;
errno_t errorCode = fopen_s(&ptr, ".\\file", "wb");
for (i = 0; i<len1 - 1; i++)
fprintf(ptr, "%c", var[i]);
fclose(ptr);
return 0;
}
dll.def
LIBRARY dll
EXPORTS
wdl @1
vbproject
Module Module1
Public Declare Auto Function wdl _
Lib "dll.dll" Alias "wdl" ()
Sub Main()
Console.WriteLine("inside vb.net")
wdl()
End Sub
End Module
代码似乎有意义,但我无法知道我是否遗漏了某些东西或者有某种错误。任何帮助都会非常感激!
答案 0 :(得分:1)
您没有指定返回类型,因此VB假定它是变体。你不希望这样。它是C int
或VB Integer
。编码如下:
Public Declare Auto Function wdl Lib "dll.dll" Alias "wdl" () As Integer
那就是说,这些天pinvoke比Declare
更受欢迎,所以我会这样写:
<DllImport("dll.dll")> _
Public Shared Function wdl() As Integer
End Function