C 生成 呼叫動態鏈結庫

2022-09-16 13:36:12 字數 3867 閱讀 4134

一、需求描述

(1)用**生成動態鏈結庫

(2)用c#**呼叫動態鏈結庫

二、生成動態鏈結庫

(1)新建類庫

(2)新增welcomeinfo類

**如下(僅供測試用,例子很簡單):

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

system.threading.tasks;67

namespace

generatedll816

}17 }

(3)生成dll動態鏈結庫

生成的dll在這裡啦

二、c#呼叫dll

(1)新建乙個控制台程式

(2)方法一

1             assembly assembly = assembly.loadfile("

e:/haostudy/generatedll/generatedll/bin/debug/generatedll.dll");

23//獲取型別,引數(命名空間+類)

4 type type = assembly.gettype("

generatedll.welcomeinfo");

56//建立該物件的例項,object型別,引數(命名空間+類)

7object instance = assembly.createinstance("

generatedll.welcomeinfo");

89//設定方法中的引數型別,type型別;如有多個引數可以追加多個

10 type params_type = new type[1

];11 params_type[0] = type.gettype("

system.string");

12//

設定方法中的引數值;如有多個引數可以追加多個

13 object params_obj = new object[1

];14 params_obj[0] = "

lucy";

1516

//執行showmsg方法

17string str = type.getmethod("

showmsg

", params_type).invoke(instance, params_obj).tostring();

18console.writeline(str);

19 console.read();

(3)方法二

1             assembly assembly = assembly.loadfile("

e:/haostudy/generatedll/generatedll/bin/debug/generatedll.dll");

2//獲取型別,引數(命名空間 + 類)

3 type typedbhelpher = assembly.gettype("

generatedll.welcomeinfo");

4object odbhelper =activator.createinstance(typedbhelpher);5//

需要呼叫的方法名

6 methodinfo method = typedbhelpher.getmethod("

showmsg");

7//引數集合

8object v = method.invoke(odbhelper, new

object );

9string str =v.tostring();

10console.writeline(str);

11 console.read();

說明:兩個方法大同小異,只是個別寫法不一樣,我個人更喜歡用第一種方法,感覺思路更清晰。

(3)效果

三、呼叫dll一次之後,就不能進行呼叫了,提示dll被占用的解決方案

1

//assembly assembly = assembly.loadfile("e:/haostudy/generatedll/generatedll/bin/debug/generatedll.dll");2//

此處改成這種方式即可

3byte bytedll = system.io.file.readallbytes("

e:/haostudy/generatedll/generatedll/bin/debug/generatedll.dll");

4 assembly assembly =assembly.load(bytedll);5//

獲取型別,引數(命名空間+類)

6 type type = assembly.gettype("

generatedll.welcomeinfo");

78//建立該物件的例項,object型別,引數(命名空間+類)

9object instance = assembly.createinstance("

generatedll.welcomeinfo");

1011

//設定方法中的引數型別,type型別;如有多個引數可以追加多個

12 type params_type = new type[1

];13 params_type[0] = type.gettype("

system.string");

14//

設定方法中的引數值;如有多個引數可以追加多個

15 object params_obj = new object[1

];16 params_obj[0] = "

lucy";

1718

//執行showmsg方法

19string str = type.getmethod("

showmsg

", params_type).invoke(instance, params_obj).tostring();

20console.writeline(str);

21 console.read();

疑問:之前是在同乙個頁面既生成dll,又呼叫dll,就會出現「被占用」的錯誤,而且也無法多次呼叫同一dll。這次呼叫多次,也沒有出現這個錯誤,不知是什麼原因,有時間還得再實驗下。

so動態鏈結庫生成 呼叫

linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於靜態連線 1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡...

生成動態鏈結庫

fpic pic就是position independent code pic使.so檔案的 段變為真正意義上的共享 如果不加 fpic,則載入.so檔案的 段時,段引用的資料物件需要重定位,重定位會修改 段的內容,這就造成每個使用這個.so檔案 段的程序在核心裡都會生成這個.so檔案 段的copy...

MFC 動態鏈結庫的生成呼叫。

1.新建mfc dll程式。2.在專案中新增.cpp檔案 名字隨意。我的是txt 在txt.cpp中寫入 extern c declspec dllexport void button1 void 3.右擊txt.cpp點編譯,編譯成功就行。4.在自己的dll專案debug資料夾中找到txtdll....