我想从我的 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
项目
Module Module1
Public Declare Auto Function wdl _
Lib "dll.dll" Alias "wdl" ()
Sub Main()
Console.WriteLine("inside vb.net")
wdl()
End Sub
End Module
该代码似乎很有意义,但我无法确定我是否遗漏了某些内容或存在某种错误。任何帮助将不胜感激!
最佳答案
您没有指定返回类型,因此 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
关于c++ - 无法在 vb.net 项目中使用 c++ dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141426/