c++ - 无法在 vb.net 项目中使用 c++ dll

标签 c++ vb.net dll pinvoke

我想从我的 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/

相关文章:

c# - dll 中的 WPF 自定义控件

windows - Win32 32位进程加载64位kernel32.dll

c# - 如何在 .NET Compact Framework(C#) 中编码 "Cstring"类型?

c++ - 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp

c++ - 在 C++ 中,返回从本地 char 数组创建的字符串会导致内存泄漏或未定义的行为吗?

vb.net - 添加新项目时自动添加命名空间

c# - C# 和 VB 如何处理命名参数之间的差异?

c++ - 将对象(而不是指针)向下转换为它们已知的派生类型是否安全?

c++ - 如何防止 XAML UI 元素在失去焦点时修改其外观

mysql - 如何插入空白值而不是 NULL mysql