用 COM 当然可以。不过,COM 封装比较复杂,不太熟悉的话,出错调试很麻烦。而且要求的知识面较宽。
简单的封装可以这样实现: 1)通过 VS 创建一个 CLR 类库项目,在其中可以简单封装标准的 DLL 导出函数,当然,这些导出函数实际上是不导出。然后定义一个 .net 类,在这个类中定义对应所有导出函数的公共方法,然后在公共方法内部调用这些标准的 C++ 函数。生成这个 CLR DLL。 2)在VB中,可以引入这个 CLR DLL,然后 VB 就可以通过调用 CLR DLL 中定义的 .net 类来间接调用原来标准的 C++ DLL 导出函数了。
当然,因为在.net 中,所有的实现都是通过类来封装的,强调的是面向对象的编程理念。因此,可以将 C++ DLL 本来的导出函数封装成类。然后实例化一个全局 C++ 类,在后续定义的.net 类中,定义相关的公共方法,私有方法,在内部对这个全局的 C++ 类进行操作(这一切都是在同一个.cpp文件中就可以完成的,利用 cl 编译器的混编特性进行编译)。在客户程序,唯一要做的就是调用公共方法就 OK 了。
class NestedCppClass { public: void PrintInfo() { printf("NestedCppClass\r\n"); }
int Func(int i) { return ++i; } };
NestedCppClass g_ncc;
#pragma managed ///////////////////////////////
/////////////////////////////// // 托管代码。 using namespace System;
namespace NestedCppClassDll {
public ref class OutClrClass { public: void PrintInfo() { Console::WriteLine("OutClrClass"); g_ncc.PrintInfo(); }
int Func(int i) { return g_ncc.Func(i); } }; } ///////////////////////////////
'VB控制台项目。 '项目需要引入CLR DLL 'Module1.vb Module Module1 Sub Main() Dim c As NestedCppClassDll.OutClrClass c = New NestedCppClassDll.OutClrClass c.PrintInfo() System.Console.WriteLine(c.Func(1)) End Sub End Module