VC编程之关于在VB.NET中调用使用VC++编写的类库dll的一点笔记
小标 2018-09-04 来源 : 阅读 1412 评论 0

摘要:本文主要向大家介绍了VC编程之关于在VB.NET中调用使用VC++编写的类库dll的一点笔记,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之关于在VB.NET中调用使用VC++编写的类库dll的一点笔记,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路。然而在实现过程中却遇到了很多的问题。
我在这个过程中是负责使用vb.net编写UI并调用编写好的DLL进行计算的。
 
目标

使用c++把类封装到dll,并在vb.net中调用该dll,使用该dll中封装好的类。在查找资料的过程中,发现vb.net调用dll的方法主要有两种。
(IDE:Visual Studio 2013 professional)
 
方法一:使用Declare语句

vb.net:

Public Declare Function getChar Lib "DllFunction.dll" (ByVal strName As String) As String


由于Declare语句只能声明函数,因而我尝试用c语言写了一个dll,也可能是我水平太渣不知道怎么写dll,采用了多种方法仍然不行。
执行后报错如下:

“System.EntryPointNotFoundException”类型的未经处理的异常在 PairProgram.exe 中发生
其他信息: 无法在 DLL“DllFunction.dll”中找到名为“getChar”的入口点。


在这种方法中,对于vb和c中字符串不兼容的问题,不少资料表示在vb.net声明的时候将string声明为ByVal,即可正常传参给c语言中char*类型。本例中没能进行测试。
另外,Declare语句是Visual Basic提供的语句,个人感觉已经是比较过时的语句了。
 
方法二:使用DllImport

该方法首先需要导入包:

Imports System.Runtime.InteropServices


然后使用DllImport:

 Function getC(ByVal lpClassName As Integer) As Integer
End Function


只可惜,直接出现了语法错误,不能编译。报错如下:

“System.Runtime.InteropServices.DllImportAttribute”不能应用于实例方法。


该错误的具体解释,我并没能在百度上找到相关资料,也许只能在一些不存在的网站上才能找到。
Dllimport是属于.net Framework的,可以在.net Framework下的各个语言中使用,如C#。
 
方法三:编写类库并添加引用。

第三种方法是在得知类库后偶然想到的,在搜索过程中并没有找到这样的思路。
首先我们使用c++编写dll:
新建一个Visual C++ Class Library空项目,在打开的.h中键入如下代码:

#include
#pragma once

using namespace std;
namespace testDll2 {
 public ref class Class1
 {
 public:
  int getInt(int k) {
   return k;
  }
  string getString(string s) {
   return s;
  }
 };
}


然后build solution得到testDll2.dll。
新建一个Visual Basic Forms Application
点击项目(Project)->添加引用(Add Referance),添加刚刚得到的testDll2.dll。此时,我们已经能够直接使用testDll2.dll中的Class1了。

Dim a As New testDll2.Class1
MsgBox(a.getInt(233), MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Title - getInt")


可得如下结果:

但是我们发现一个问题:我们并不能调用a.getString(s)方法,这个方法根本没有被引用,原因很简单,c++的std::string和vb中的String类并不兼容。
经过多次尝试,最中找到了解决方案,那就是使用System::String,并在代码中使用String^。
C++:

// testDll2.h
#pragma once
using namespace System;
namespace testDll2 {
 public ref class Class1
 {
 public:
  int getInt(int k) {
   return k;
  }
  String^ getString(String^ s) {
   return s;
  }
 };
}


这样,在vb.net中便可以识别并正常使用getString()函数。

MsgBox(a.getString(ExpBox.Text), MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Title - getStr")


执行结果如下:
 
 
后记

学会了以后才发现其实这是个非常简单的事情,最后的解决方案一两分钟就能讲完,也没有任何技术难度。大神们觉得这么简单没有必要说,渣渣们在门口徘徊就是进不去。受制于各方面的原因,vb.net的各方面资料在网上远不如c/c++、Java那么多。仅剩的一些资料中,很多内容仍然是十几年前不含.net的纯vb内容(找到的最多的解决方案就是使用Declare语句),一部分又是c#.net的内容,真正点中vb.net的资料少之又少。写下这个方法,希望能给一些新手一点帮助。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程