真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言怎么做dll,go語言做什么

golang編譯dll給C#調(diào)用

最近需要用到golang編譯dll給C#調(diào)用,記錄一下,希望可以給遇到的朋友一些幫助。

創(chuàng)新互聯(lián)公司專注于大關(guān)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供大關(guān)營銷型網(wǎng)站建設(shè),大關(guān)網(wǎng)站制作、大關(guān)網(wǎng)頁設(shè)計(jì)、大關(guān)網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造大關(guān)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供大關(guān)網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

開發(fā)環(huán)境:

1.windows7,VS2019,VScode

2.macOS,VScode

習(xí)慣在macos開發(fā)golang應(yīng)用,先寫好了dll,可以參考:

然后在windows7上面使用C#調(diào)用的時候出現(xiàn)不能識別dll,于是只好在windows7安裝golang開發(fā)環(huán)境。

簡單安裝了VScode和mingw64.

測試時發(fā)現(xiàn)了一個問題,如下:

最后找到的原因是我的windows7是64位的,mingw也是64位的,需要在VS2019里面將目標(biāo)平臺設(shè)置如下:

當(dāng)然,也可以將目標(biāo)平臺設(shè)置為x64的即可,我這樣設(shè)置,系統(tǒng)就自己去適配了。

網(wǎng)上的大部分是說設(shè)置目標(biāo)平臺為x86,這個要根據(jù)具體情況而來,不能一概而論。好了,希望能幫到您。

怎么吧go程序打包成可運(yùn)行的EXE文件

你在編譯器里面build一下,然后去\bin\debug目錄下找.exeexe就是可執(zhí)行文件了。運(yùn)行的時候可能需要用到debug目錄下的其他文件(如配置文件、dll等),所以需要把debug下的所有文件都放到一起。

.dll文件是用什么編寫的呀?

DLL是一種特殊的可執(zhí)行文件。說它特殊主要是因?yàn)橐话闼疾荒苤苯舆\(yùn)行,需要宿主程序比如*.EXE程序或其他DLL的動態(tài)調(diào)用才能夠使用。簡單的說,在通常情況下DLL是經(jīng)過編譯的函數(shù)和過程的集合。

使用DLL技術(shù)主要有以下幾個原因:

一、減小可執(zhí)行文件大小。

DLL技術(shù)的產(chǎn)生有很大一部分原因是為了減小可執(zhí)行文件的大小。當(dāng)操作系統(tǒng)進(jìn)入Windows時代后,其大小已經(jīng)達(dá)到幾十兆乃至幾百兆。試想如果還是使用DOS時代的單執(zhí)行文件體系的話一個可執(zhí)行文件的大小可能將達(dá)到數(shù)十兆,這是大家都不能接受的。解決的方法就是采用動態(tài)鏈接技術(shù)將一個大的可執(zhí)行文件分割成許多小的可執(zhí)行程序。

二、實(shí)現(xiàn)資源共享。

這里指的資源共享包括很多方面,最多的是內(nèi)存共享、代碼共享等等。早期的程序員經(jīng)常碰到這樣的事情,在不同的編程任務(wù)中編寫同樣的代碼。這種方法顯然浪費(fèi)了很多時間,為了解決這個問題人們編寫了各種各樣的庫。但由于編程語言和環(huán)境的不同這些庫一般都不能通用,而且用戶在運(yùn)行程序時還需要這些庫才行,極不方便。DLL的出現(xiàn)就像制定了一個標(biāo)準(zhǔn)一樣,使這些庫有了統(tǒng)一的規(guī)范。這樣一來,用不同編程語言的程序員可以方便的使用用別的編程語言編寫的DLL。另外,DLL還有一個突出的特點(diǎn)就是在內(nèi)存中只裝載一次,這一點(diǎn)可以節(jié)省有限的內(nèi)存,而且可以同時為多個進(jìn)程服務(wù)。

三、便于維護(hù)和升級。

細(xì)心的朋友可能發(fā)現(xiàn)有一些DLL文件是有版本說明的。(查看DLL文件的屬性可以看到,但不是每一個DLL文件都有)這是為了便于維護(hù)和升級。舉個例子吧,早期的Win95中有一個BUG那就是在閏年不能正確顯示2月29日這一天。后來,Microsoft發(fā)布了一個補(bǔ)丁程序糾正了這個BUG。值得一提的是,我們并沒有重裝Win95,而是用新版本的DLL代替了舊版本的DLL。(具體是哪一個DLL文件筆者一時想不起來了。)另一個常見的例子是驅(qū)動程序的升級。例如,著名的DirectX就多次升級,現(xiàn)在已經(jīng)發(fā)展到了6.0版了。更妙的是,當(dāng)我們試圖安裝較低版本的DLL時,系統(tǒng)會給我們提示,避免人為的操作錯誤。例如我們升級某硬件的驅(qū)動程序時,經(jīng)常碰到Windows提示我們當(dāng)前安裝的驅(qū)動程序比原來的驅(qū)動程序舊。

四、比較安全。

這里說的安全也包括很多方面。比如,DLL文件遭受病毒的侵害機(jī)率要比普通的EXE文件低很多。另外,由于是動態(tài)鏈接的,這給一些從事破壞工作的“高手”們多少帶來了一些反匯編的困難。

第二章 在Delphi中編寫DLL top

注意:在這里筆者假定讀者使用的是Delphi 3或Delphi 4開場白說了那么多,總該言歸正傳了。編寫DLL其實(shí)也不是一件十分困難的事,只是要注意一些事項(xiàng)就夠了。為便于說明,我們先舉一個例子。

library Delphi;

uses

SysUtils,

Classes;

function TestDll(i:integer):integer;stdcall;

begin

Result:=i;

end;

exports

TestDll;

begin

end.

上面的例子是不是很簡單?熟悉Delphi的朋友可以看出以上代碼和一般的Delphi程序的編寫基本是相同的,只是在TestDll函數(shù)后多了一個stdcall參數(shù)并且用exports語句聲明了TestDll函數(shù)。只要編譯上面的代碼,就可以得到一個名為Delphi.dll的動態(tài)鏈接庫?,F(xiàn)在,讓我們來看看有哪些需要注意的地方。 一、在DLL中編寫的函數(shù)或過程都必須加上stdcall調(diào)用參數(shù)。在Delphi 1或Delphi 2環(huán)境下該調(diào)用參數(shù)是far。從Delphi 3以后將這個參數(shù)變?yōu)榱藄tdcall,目的是為了使用標(biāo)準(zhǔn)的Win32參數(shù)傳遞技術(shù)來代替優(yōu)化的register參數(shù)。忘記使用stdcall參數(shù)是常見的錯誤,這個錯誤不會影響DLL的編譯和生成,但當(dāng)調(diào)用這個DLL時會發(fā)生很嚴(yán)重的錯誤,導(dǎo)致操作系統(tǒng)的死鎖。原因是register參數(shù)是Delphi的默認(rèn)參數(shù)。

二、所寫的函數(shù)和過程應(yīng)該用exports語句聲明為外部函數(shù)。

正如大家看到的,TestDll函數(shù)被聲明為一個外部函數(shù)。這樣做可以使該函數(shù)在外部就能看到,具體方法是單激鼠標(biāo)右鍵用“快速查看(Quick View)”功能查看該DLL文件。(如果沒有“快速查看”選項(xiàng)可以從Windows CD上安裝。)TestDll函數(shù)會出現(xiàn)在Export Table欄中。另一個很充分的理由是,如果不這樣聲明,我們編寫的函數(shù)將不能被調(diào)用,這是大家都不愿看到的。

三、當(dāng)使用了長字符串類型的參數(shù)、變量時要引用ShareMem。

Delphi中的string類型很強(qiáng)大,我們知道普通的字符串長度最大為256個字符,但Delphi中string類型在默認(rèn)情況下長度可以達(dá)到2G。(對,您沒有看錯,確實(shí)是兩兆。)這時,如果您堅(jiān)持要使用string類型的參數(shù)、變量甚至是記錄信息時,就要引用ShareMem單元,而且必須是第一個引用的。既在uses語句后是第一個引用的單元。如下例:

uses

ShareMem,

SysUtils,

Classes;

還有一點(diǎn),在您的工程文件(*.dpr)中而不是單元文件(*.pas)中也要做同樣的工作,這一點(diǎn)Delphi自帶的幫助文件沒有說清楚,造成了很多誤會。不這樣做的話,您很有可能付出死機(jī)的代價。避免使用string類型的方法是將string類型的參數(shù)、變量等聲明為Pchar或ShortString(如:s:string[10])類型。同樣的問題會出現(xiàn)在當(dāng)您使用了動態(tài)數(shù)組時,解決的方法同上所述。

第三章 在Delphi中靜態(tài)調(diào)用DLL top

調(diào)用一個DLL比寫一個DLL要容易一些。首先給大家介紹的是靜態(tài)調(diào)用方法,稍后將介紹動態(tài)調(diào)用方法,并就兩種方法做一個比較。同樣的,我們先舉一個靜態(tài)調(diào)用的例子。

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

//本行以下代碼為我們真正動手寫的代碼

function TestDll(i:integer):integer;stdcall;

external ’Delphi.dll’;

procedure TForm1.Button1Click(Sender: TObject);

begin

Edit1.Text:=IntToStr(TestDll(1));

end;

end.

上面的例子中我們在窗體上放置了一個編輯框(Edit)和一個按鈕(Button),并且書寫了很少的代碼來測試我們剛剛編寫的Delphi.dll。大家可以看到我們唯一做的工作是將TestDll函數(shù)的說明部分放在了implementation中,并且用external語句指定了Delphi.dll的位置。(本例中調(diào)用程序和Delphi.dll在同一個目錄中。)讓人興奮的是,我們自己編寫的TestDll函數(shù)很快被Delphi認(rèn)出來了。您可做這樣一個實(shí)驗(yàn):輸入“TestDll(”,很快Delphi就會用fly-by提示條提示您應(yīng)該輸入的參數(shù)是什么,就像我們使用Delphi中定義的其他函數(shù)一樣簡單。注意事項(xiàng)有以

下一些:

一、調(diào)用參數(shù)用stdcall。

和前面提到的一樣,當(dāng)引用DLL中的函數(shù)和過程時也要使用stdcall參數(shù),原因和前面提到的一樣。

二、用external語句指定被調(diào)用的DLL文件的路徑和名稱。

正如大家看到的,我們在external語句中指定了所要調(diào)用的DLL文件的名稱。沒有寫路徑是因?yàn)樵揇LL文件和調(diào)用它的主程序在同一目錄下。如果該DLL文件在C:\,則我們可將上面的引用語句寫為external ’C:\Delphi.dll’。注意文件的后綴.dll必須寫上。

三、不能從DLL中調(diào)用全局變量。

如果我們在DLL中聲明了某種全局變量,如:var s:byte 。這樣在DLL中s這個全局變量是可以正常使用的,但s不能被調(diào)用程序使用,既s不能作為全局變量傳遞給調(diào)用程序。不過在調(diào)用程序中聲明的變量可以作為參數(shù)傳遞給DLL。

四、被調(diào)用的DLL必須存在。

這一點(diǎn)很重要,使用靜態(tài)調(diào)用方法時要求所調(diào)用的DLL文件以及要調(diào)用的函數(shù)或過程等等必須存在。如果不存在或指定的路徑和文件名不正確的話,運(yùn)行主程序時系統(tǒng)會提示“啟動程序時出錯”或“找不到*.dll文件”等運(yùn)行錯誤。

第四章 在Delphi中動態(tài)調(diào)用DLL top

動態(tài)調(diào)用DLL相對復(fù)雜很多,但非常靈活。為了全面的說明該問題,這次我們舉一個調(diào)用由C++編寫的DLL的例子。首先在C++中編譯下面的DLL源程序。

#include

extern ”C” _declspec(dllexport)

int WINAPI TestC(int i)

{

return i;

}

編譯后生成一個DLL文件,在這里我們稱該文件為Cpp.dll,該DLL中只有一個返回整數(shù)類型的函數(shù)TestC。為了方便說明,我們?nèi)匀灰蒙厦娴恼{(diào)用程序,只是將原來的Button1Click過程中的語句用下面的代碼替換掉了。

procedure TForm1.Button1Click(Sender: TObject);

type

TIntFunc=function(i:integer):integer;stdcall;

var

Th:Thandle;

Tf:TIntFunc;

Tp:TFarProc;

begin

Th:=LoadLibrary(’Cpp.dll’); {裝載DLL}

if Th0 then

try

Tp:=GetProcAddress(Th,PChar(’TestC’));

if Tpnil

then begin

Tf:=TIntFunc(Tp);

Edit1.Text:=IntToStr(Tf(1)); {調(diào)用TestC函數(shù)}

end

else

ShowMessage(’TestC函數(shù)沒有找到’);

finally

FreeLibrary(Th); {釋放DLL}

end

else

ShowMessage(’Cpp.dll沒有找到’);

end;

大家已經(jīng)看到了,這種動態(tài)調(diào)用技術(shù)很復(fù)雜,但只要修改參數(shù),如修改LoadLibrary(’Cpp.dll’)中的DLL名稱為’Delphi.dll’就可動態(tài)更改所調(diào)用的DLL。

一、定義所要調(diào)用的函數(shù)或過程的類型。

在上面的代碼中我們定義了一個TIntFunc類型,這是對應(yīng)我們將要調(diào)用的函數(shù)TestC的。在其他調(diào)用情況下也要做同樣的定義工作。并且也要加上stdcall調(diào)用參數(shù)。

二、釋放所調(diào)用的DLL。

我們用LoadLibrary動態(tài)的調(diào)用了一個DLL,但要記住必須在使用完后手動地用FreeLibrary將該DLL釋放掉,否則該DLL將一直占用內(nèi)存直到您退出Windows或關(guān)機(jī)為止。

現(xiàn)在我們來評價一下兩種調(diào)用DLL的方法的優(yōu)缺點(diǎn)。靜態(tài)方法實(shí)現(xiàn)簡單,易于掌握并且一般來說稍微快一點(diǎn),也更加安全可靠一些;但是靜態(tài)方法不能靈活地在運(yùn)行時裝卸所需的DLL,而是在主程序開始運(yùn)行時就裝載指定的DLL直到程序結(jié)束時才釋放該DLL,另外只有基于編譯器和鏈接器的系統(tǒng)(如Delphi)才可以使用該方法。動態(tài)方法較好地解決了靜態(tài)方法中存在的不足,可以方便地訪問DLL中的函數(shù)和過程,甚至一些老版本DLL中新添加的函數(shù)或過程;但動態(tài)方法難以完全掌握,使用時因?yàn)椴煌暮瘮?shù)或過程要定義很多很復(fù)雜的類型和調(diào)用方法。對于初學(xué)者,筆者建議您使用靜態(tài)方法,待熟練后再使用動態(tài)調(diào)用方法。

第五章 使用DLL的實(shí)用技巧 top

一、編寫技巧。

1 、為了保證DLL的正確性,可先編寫成普通的應(yīng)用程序的一部分,調(diào)試無誤后再從主程序中分離出來,編譯成DLL。

2 、為了保證DLL的通用性,應(yīng)該在自己編寫的DLL中杜絕出現(xiàn)可視化控件的名稱,如:Edit1.Text中的Edit1名稱;或者自定義非Windows定義的類型,如某種記錄。

3 、為便于調(diào)試,每個函數(shù)和過程應(yīng)該盡可能短小精悍,并配合具體詳細(xì)的注釋。

4 、應(yīng)多利用try-finally來處理可能出現(xiàn)的錯誤和異常,注意這時要引用SysUtils單元。

5 、盡可能少引用單元以減小DLL的大小,特別是不要引用可視化單元,如Dialogs單元。例如一般情況下,我們可以不引用Classes單元,這樣可使編譯后的DLL減小大約16Kb。

二、調(diào)用技巧。

1 、在用靜態(tài)方法時,可以給被調(diào)用的函數(shù)或過程更名。在前面提到的C++編寫的DLL例子中,如果去掉extern ”C”語句,C++會編譯出一些奇怪的函數(shù)名,原來的TestC函數(shù)會被命名為@TestC$s等等可笑的怪名字,這是由于C++采用了C++ name mangling技術(shù)。這個函數(shù)名在Delphi中是非法的,我們可以這樣解決這個問題:

改寫引用函數(shù)為

function TestC(i:integer):integer;stdcall;

external ’Cpp.dll’;name ’@TestC$s’;

其中name的作用就是重命名。

2 、可把我們編寫的DLL放到Windows目錄下或者Windows\system目錄下。這樣做可以在external語句中或LoadLibrary語句中不寫路徑而只寫DLL的名稱。但這樣做有些不妥,這兩個目錄下有大量重要的系統(tǒng)DLL,如果您編的DLL與它們重名的話其后果簡直不堪設(shè)想,況且您的編程技術(shù)還不至于達(dá)到將自己編寫的DLL放到系統(tǒng)目錄中的地步吧!

三、調(diào)試技巧。

1 、我們知道DLL在編寫時是不能運(yùn)行和單步調(diào)試的。有一個辦法可以,那就是在Run|parameters菜單中設(shè)置一個宿主程序。在Local頁的Host Application欄中添上宿主程序的名字就可進(jìn)行單步調(diào)試、斷點(diǎn)觀察和運(yùn)行了。

2 、添加DLL的版本信息。開場白中提到了版本信息對于DLL是很重要的,如果包含了版本信息,DLL的大小會增加2Kb。增加這么一點(diǎn)空間是值得的。很不幸我們?nèi)绻苯邮褂肞roject|options菜單中Version選項(xiàng)是不行的,這一點(diǎn)Delphi的幫助文件中沒有提到,經(jīng)筆者研究發(fā)現(xiàn),只要加一行代碼就可以了。如下例:

library Delphi;

uses

SysUtils,

Classes;

{$R *.RES}

//注意,上面這行代碼必須加在這個位置

function TestDll(i:integer):integer;stdcall;

begin

Result:=i;

end;

exports

TestDll;

begin

end.

3 、為了避免與別的DLL重名,在給自己編寫的DLL起名字的時候最好采用字符數(shù)字和下劃線混合的方式。如:jl_try16.dll。

4 、如果您原來在Delphi 1或Delphi 2中已經(jīng)編譯了某些DLL的話,您原來編譯的DLL是16位的。只要將源代碼在新的Delphi 3或Delphi 4環(huán)境下重新編譯,就可以得到32位的DLL了。

[后記]:除了上面介紹的DLL最常用的使用方法外,DLL還可以用于做資源的載體。例如,在Windows中更改圖標(biāo)就是使用的DLL中的資源。另外,熟練掌握了DLL的設(shè)計(jì)技術(shù),對使用更為高級的OLE、COM以及ActiveX編程都有很多益處。

golang調(diào)用DLL中的函數(shù)

在golang中加載dll并調(diào)用函數(shù)流程如下:

1.加載dll動態(tài)庫到內(nèi)存 syscall.LoadLibrary

2.獲取函數(shù)地址 syscall.GetProcAddress

3.執(zhí)行系統(tǒng)調(diào)用,傳入?yún)?shù) syscall.Syscall6

一個系統(tǒng)消息框函數(shù)的調(diào)用示例:

如何在Go語言中調(diào)用DLL

關(guān)鍵是 lpOnRecvCardEvent 這個函數(shù)的第二個參數(shù)是個 C++ 指針。 樓主在 C# 中聲明這個導(dǎo)出函數(shù)時,使用了并不對應(yīng)的 CardEvent[] C# 數(shù)組類型。 正確的做法是: 在 C# 聲明 lpOnRecvCardEvent 時,第二個參數(shù)應(yīng)該是 IntPtr ,不是數(shù)組。 由于樓...

dll文件是做什么的,用什么語言寫?

動態(tài)鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進(jìn)程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個應(yīng)用程序可同時訪問內(nèi)存中單個DLL 副本的內(nèi)容。DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。 編輯本段DLL 的優(yōu)點(diǎn) 1、擴(kuò)展了應(yīng)用程序的特性; 2、可以用許多種編程語言來編寫; 3、簡化了軟件項(xiàng)目的管理; 4、有助于節(jié)省內(nèi)存; 5、有助于資源共享; 6、有助于應(yīng)用程序的本地化; 7、有助于解決平臺差異; 8、可以用于一些特殊的目的。windows使得某些特性只能為DLL所用。 一般用 C++ 語言編寫。


分享文章:go語言怎么做dll,go語言做什么
網(wǎng)頁鏈接:http://weahome.cn/article/hohdcp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部