前言
結對作業要求一出來,我就立刻想到了把“計算核心”封裝成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的資料少之又少。寫下這個方法,希望能給一些新手一點幫助。
