前言


结对作业要求一出来,我就立刻想到了把“计算核心”封装成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:

<DllImport("d:\DllFunction.dll")> 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<string>
#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的资料少之又少。写下这个方法,希望能给一些新手一点帮助。

关于在VB.NET中调用使用VC++编写的类库dll的一点笔记的更多相关文章

  1. Csharp调用基于Opencv编写的类库文件

    现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做GreenOpenCsharpWarper,简称GOCW. 一.CLR编写的DLL部分 1.按照正常方法引入Ope ...

  2. 可供VC调用的QT编写的界面DLL方法

    一般直接编写的QT动态库是无法被Windows下的VC6.0等调用的. 如下步骤 第一步:必须要在QT界面库源码下包含qtwinmigrate的源码包和库,网上可下载到. 第二步:在QT的proc文件 ...

  3. Java调用C/C++编写的第三方dll动态链接库(zz)

    这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...

  4. api 接口开发理论 在php中调用接口以及编写接口

    如: http://localhost/openUser.php?act=get_user_list&type=json 在这里openUser.php相当于一个接口,其中get_user_l ...

  5. 在ASP中调用DLL的方法

    .net的dll已经不是严格意义上的动态连接库了,而是一个类或者类库.它是不能直接在ASP.VB等其它的应用环境中使用的.   我们可以通过COM包装器(COM callable wrapper (C ...

  6. c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)

    转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 . ...

  7. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  8. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  9. 在.Net Framework中调用Python的脚本方法 (以VB和C#为例)

    某个项目中涉及到这样一个情景: VB/C#写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法. 具体步骤流程如下 ...

随机推荐

  1. mysql安装方法

    Window版本 1.下载 MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ 2.解压 如果想要让MySQL安装在 ...

  2. Linux时间子系统之三:时间的维护者:timekeeper

    专题文档汇总目录 Notes: 原文地址:Linux时间子系统之三:时间的维护者:timekeeper 本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法 ...

  3. vue中的watch方法 实时同步存储数据

    watch 监视模式里面有个独特的方法handler 注意要加上deep: true.deep为true时,当对象的key值改变时也监听 当值发生改变被watch监视到触发了事件 开始执行handle ...

  4. [LOJ3083][GXOI/GZOI2019]与或和——单调栈

    题目链接: [GXOI/GZOI2019]与或和 既然求的是二进制运算的和,那么我们按位考虑,这样就将矩阵变成了一个$01$矩阵. 对于或运算,就是求有多少个子矩形中有$1$. 直接求不好办,考虑有多 ...

  5. Effective Java 第三版——63. 注意字符串连接的性能

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  6. 程序-代写(qq:928900200)

    CS 310 Programming Assignment 4 Due April 27, 2014 5:00 P.M. About 15 years in the future... The Mar ...

  7. ASP.NET MVC开发基础

    一.ASP.Net MVC的开发模式 (1)处理流程 在ASP.Net MVC中,客户端所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Mode ...

  8. PHP中imagecopyresampled参数详解

    原文链接http://blog.csdn.net/ajaxchen_615/article/details/5941181 做php缩微图程序,用到了imagecopyresampled函数,在网上找 ...

  9. Linux下CPU信息的查看

    逻辑CPU个数: cat /proc/cpuinfo | grep "processor" | wc -l     //32 物理CPU个数: cat /proc/cpuinfo ...

  10. css中的clear:both,display:flex;

    介绍两者一起讨论的原因: 在明天就国庆的日子里陪着程序员的只有代码,啤酒,还有音乐,然后就是灯光下默默陪伴自己的影子.好了,不矫情了. -------------------------------- ...