前言


结对作业要求一出来,我就立刻想到了把“计算核心”封装成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. 【PAT】B1038 统计同成绩学生(20)(20 分)

    #include<stdio.h> int arr[102]={0};//分数作为自己的下标,注意 int main(){ int N;scanf("%d",& ...

  2. 如何使用 eclipse进行断点 debug 程序

    先给出一段程序,然后通过使用 eclipse 设置断点进行一步步操作看结果 package cn.debug.com; public class Demo18 { public static void ...

  3. POI生成Web版Word文件

    POI生成Web版Word文件 1       通过URL的输入流实现 2       直接把Html文本写入到Word文件 所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到 ...

  4. Android的面向组件思想

    http://blog.csdn.net/luoxinwu123/article/details/8019547 面向组件思想是在软件规模扩大,复杂度上升的背景下,以面向对象为基础而提出的一种软件设计 ...

  5. 采用spring的schedule注解配置定时任务

    1 在springmvc配置文件中新增以下配置 <!-- 此处对于定时时间的配置会被注解中的时间配置覆盖,因此,以注解配置为准 --> <task:scheduled-tasks s ...

  6. oracle11gR2 手工创建基于asm存储的oracle实例

    http://www.cnblogs.com/beanbee/archive/2012/09/22/2697689.html使用命令行手工建立Oracle11gR2数据库 通过命令行建立一个数据库可以 ...

  7. 利用Apache AXIS 1 发布WebService

    首先,AXIS 是apache的作品. 1.到apache去下载相关的包,包括axis.jar.axis-ant.jar.commons-discovery-0.2.jar等.将jar包放到WEB-I ...

  8. 在Qt项目中如何添加一个已有的项目作为子项目

    新建一个子目录项目(具体方法参见<类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目>),然后需要添加的项目移动到该子目录项目目录下,再在其pro文件中添 ...

  9. PAT A1012 The Best Rank (25 分)——多次排序,排名

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  10. JVM实践

    package com.lsw.classloader; import java.io.FileInputStream;import java.lang.reflect.Field;import ja ...