无法在 VB.NET 中使用带有来自 Visual C++ DLL 的指针参数的函数

Posted

技术标签:

【中文标题】无法在 VB.NET 中使用带有来自 Visual C++ DLL 的指针参数的函数【英文标题】:Unable to use functions with pointer arguments from Visual C++ DLL in VB.NET 【发布时间】:2015-12-30 21:49:19 【问题描述】:

我正在尝试在 VB.NET Windows 应用程序中使用 Visual C++ dll,两者都是在 VS2010 中创建的。在 Windows 项目中,我可以成功地将 dll 添加到我的引用中,但只有没有指针参数的函数才能在程序中使用并且在对象浏览器中可见。我借用了一个我找到的简单示例,并将其中一个函数参数更改为指针。 头文件:

// TestDLL.h

using namespace System;
namespace MathFuncs

    public ref class MyMathFuncs
    
        public: 
            static double Add(double *a, double B);
            static double Subtract(double a, double B);
            static double Multiply(double a, double B);
            static double Divide(double a, double B);
    ;

cpp文件

// TestDLL.cpp
// compile with: /clr /LD

#include "TestDLL.h"

namespace MathFuncs

    double MyMathFuncs::Add(double *a, double B)
    
        return *a + b;
    

    double MyMathFuncs::Subtract(double a, double B)
    
        return a - b;
    

    double MyMathFuncs::Multiply(double a, double B)
    
        return a * b;
    

    double MyMathFuncs::Divide(double a, double B)
    
        if (b == 0)
        
            throw gcnew DivideByZeroException("b cannot be zero!");
        

        return a / b;
    

dll 编译成功,没有任何警告。当我在一个简单的 Windows 窗体中引用 dll 时,我得到了错误:

“错误 1 ​​'Add' 的返回类型不受支持或参数类型不受支持。”

如果我删除指针,dll 工作正常。在其他论坛中,我认为调用约定可能有问题并尝试使用 __stdcall,但我收到另一个错误,提示引用类不能使用 __stdcall

我还尝试不引用 dll,而是从 windows 应用程序的模块中声明 dll 函数。我收到一条错误消息,提示“找不到入口点”,我认为这是因为 C++ 修饰了函数名。我试过 dumpbin.exe/EXPORTS "dll PATH" 但它不会显示修饰的函数名称。我也尝试过创建一个模块定义文件并使用 extern "c" 虽然我很可能没有正确使用它们。我为这些问题找到的所有解决方案都适用于非托管 C++,但不适用于托管 Visual C++。

我宁愿能够引用 dll,因为它看起来更简单。任何见解将不胜感激。

【问题讨论】:

VB.NET 支持原生指针吗? 是的,我相信。 C++ 指针等价于 VB.NET 中通过“ByRef”传递的变量。 ByRef 不是托管引用吗,和 C++/CLI 中的double %a 一样吗?我问是因为我对 VB.NET 中的编程一无所知,我只是在猜测,这可能是一个答案...... 我也不是专家。 VB.NET 中的双重传递 ByRef 与 C++/CLI 中的双重 * 相同。我认为这不是类型问题,因为 Visual Studio 在引用 c++ dll 时会分配 VB.NET 等效类型。 【参考方案1】:

将您的定义更改为:

    double Add(double % a, double b)
    
        return a + b;
    

这编译为ByRef 并且可以工作:

【讨论】:

以上是关于无法在 VB.NET 中使用带有来自 Visual C++ DLL 的指针参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 2008 DataGridView 不更新 Visual Foxpro 数据库

Visual Studio 2012 Vb.net 无法将配置切换到发布模式

VB.NET 如何在visual studio中制作滑入/滑出申请表(程序)?

无法在 Visual Studio 2019 上为 VB.NET Web 应用程序创建新的构建配置

使用宏删除 VB.NET 代码中的所有注释和空行的 Visual Studio 正则表达式

我们可以在最初使用 C# 安装的 Visual Studio Express 中运行 VB.Net 吗?