關於在VB.NET中調用使用VC++編寫的類庫dll的一點筆記


前言


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM