2

我想问关于如何从 C++ 程序调用 VB.NET DLL 的问题

我曾多次尝试从 C++ 调用 VB.NET DLL 文件,它工作正常,但问题是我无法调用 VB.NET DLL 文件的功能(我只能加载 VB.NET DLL 文件)

在 VB.NET DLL 中,我有以下代码:

Public Function example_function1(ByVal i As Integer) As Integer
    Return 3

End Function

Public Function example_function2(ByVal i As Integer) As Integer
    Return 3
End Function

==============================

我的 C++ 代码是:

    typedef int (__stdcall *ptf_test_func_1_type)(int); 
typedef int (__stdcall *ptf_test_func_2_type)(int*); 
int i =1;

HINSTANCE dll_instance = LoadLibrary("DLLs7.dll");

int main()
{

    if(dll_instance !=NULL)
        {
            printf("The DLLs file has been Loaded \n");
            cout << GetLastError() << endl;

            ptf_test_func_1_type p_func1=(ptf_test_func_1_type)GetProcAddress(dll_instance,"Class1::example_function1");
            ptf_test_func_2_type p_func2=(ptf_test_func_2_type)GetProcAddress(dll_instance,"Class1::example_function2");


            // Function No 1 //

                        if (p_func1 != NULL)
                                 {
                                     cout << "\nThe function number 1 is " << p_func1(i) << endl;

                                }

                        else
                                {
                                    cout << "\nFailed" << endl;
                                    cout << GetLastError() << endl;
                                }

            // Function No 2 //

                        if (p_func2 != NULL)
                                 {
                                     cout << "\nThe function number 2 is" << p_func2(&i) << endl;

                                }

                        else
                                {
                                    cout << "\nFailed" << endl;
                                    cout << GetLastError() << endl;
                                }

        }   
    else
        {
            printf("\nDLLs file Load Error");
            cout << GetLastError() << endl;
        }

        cout << GetLastError() << endl;

    return(0);
}

我的以下步骤是:

1) 我已经创建了 VB.NET DLL。

2)我创建了一个新的应用程序visual C++并选择了“win32控制台应用程序”

3)我已经编写了调用 DLL 和函数的代码(如上所示)

我是否错过了步骤或代码中的任何内容,因为我可以调用 VB.NET DLL 文件但我不能调用 VB.NET DLL 函数

如您所见,我已经编写了 GETLASTERRIR() 来查找错误

cout << GetLastError() << endl;

但是我在失败时在函数中发现了这个错误 127,在调用 DLL 文件中发现了 203

谁能帮我

非常感谢

问候

4

4 回答 4

5

由于您的 vb 程序集需要与“本机”可执行文件完全不同的运行时,因此您需要在两者之间使用一些层。该层可能是COM。

您可以通过它的“ComVisible”属性将您的程序集公开给 COM 子系统。然后,您应该注册该程序集以将其公开给 COM“订阅者”。

只有这样,您才能#import从您的 c++ 代码中获取程序集命名空间。

注意:这是一篇非常简短的 msdn 文章“如何从本机 Visual C++ 代码调用托管 DLL

编辑——刚刚试了一下......它似乎工作正常:

C# 代码

namespace Adder
{
    public interface IAdder
    {
        double add(double a1, double a2);
    }
    public class Adder : IAdder
    {
        public Adder() { }
        public double add(double a1, double a2) { return a1 + a2; }
    }
}

项目设置

[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]

(需要签名才能生成 tlb)

C++ 代码:

#import <adder.tlb> raw_interfaces_only

  CoInitialize(NULL);
  Adder::IAdderPtr a;
  a.CreateInstance( __uuidof( Adder::Adder ) );
  double d = 0;
  a->add(1.,1., &d); 
  // note: the method will return a HRESULT; 
  // the output is stored in a reference variable.
  CoUninitialize();
于 2011-05-13T12:47:29.123 回答
2
  • GetProcAddress 不理解 C++ 名称修改,更不用说任何其他修改,因此没有"Class1::example_function1"可以作为有效标识符的 dll。通常它只用于extern "C"(或在没有 ++ 的 C 中实现)函数,这些函数不会被破坏。
  • 如果它是在 VB.NET 中实现的,它根本就不是一个 dll。它是一个 .net 程序集,您需要在 CLR(.net 运行时)中运行才能使用它。您可以在 CLR 中运行 C++ 代码,但它必须是“托管 C++”,它使用特殊类型进行扩展,用于 .net 对象引用和垃圾收集器操作。
于 2011-05-13T12:39:13.847 回答
1

您不能直接从本机 C++ 访问 .NET 代码,您需要 C++/CLI。

如果您的程序需要原生 C++,则可以编写混合模式包装 DLL,为主程序提供原生 C++ 接口,并在实现中使用 C++/CLI 将调用转发到 .NET DLL。

于 2011-05-13T12:40:43.610 回答
1

您需要为此在 C++/CLI 上编写一个包装器。您可能会发现以下链接很有帮助。http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx

于 2011-05-13T12:42:42.093 回答