台灣最大程式設計社群網站
線上人數
882
 
會員總數:246134
討論主題:189713
歡迎您免費加入會員
討論區列表 >> VB.NET >> 應用程式啟動後才載入 DLL
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
應用程式啟動後才載入 DLL
價值 : 200 QP  點閱數:886 回應數:19
樓主

P陳
初級顧問
14911 186
8948 2225
發送站內信

請問一下各位,有沒有辦法在執行時才載入 DLL (或類別庫)
比如我開發了5個差不多的應用程式,90% 相同,不同的放在 甲.DLL 乙.DLL....
能不能變成
A系統啟動後
選 甲 後再帶入 甲.DLL
選 乙 後再帶入 乙.DLL
選 丁 後再帶入 丁.DLL

請問能不能作及該如何作?




搜尋相關Tags的文章: [ 應用程式啟動後才載入 DLL或類別庫 ] ,
本篇文章發表於2019-09-23 15:14
1樓
回應

Ader Chen
檢舉此回應

參考看看適不適合您的需求:
動態載入dll檔案,並實現呼叫其中的簡單方法
本篇文章回覆於2019-09-23 20:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

Ader Chen
檢舉此回應

有點興趣, 就拿我一個 dll 來測試了一下, 結果是成功的:


本篇文章回覆於2019-09-23 22:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

小魚
檢舉此回應
原來還有這一招啊..
本篇文章回覆於2019-09-23 23:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

P陳
檢舉此回應
太棒了
謝謝我試試

本篇文章回覆於2019-09-24 10:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

P陳
檢舉此回應
Ader Chen 您好:
依樣作了一下,但不知參數那婺茼p何帶。煩請再指導一下
目前的錯誤訊息是在 執行 CallbyName 時會出現下方訊息
System.NullReferenceException: '未設定物件變數或 With 區塊變數。'


本篇文章回覆於2019-09-24 10:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

Ader Chen
檢舉此回應

可能是 dll class Function 的名稱錯了,
請試試看:


本篇文章回覆於2019-09-24 10:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

P陳
檢舉此回應
Ader Chen:
改成Sum1之後 錯誤訊息一樣
intGcf = CallByName(aFunc, "Sum1", vbMethod, 231, 539) '方法名稱:Sum1

再請問一下 以下這句翻成VB.net 要如何寫
object magicClassObject = magicConstructor.Invoke(new object[] { });
本篇文章回覆於2019-09-24 11:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Ader Chen
檢舉此回應

System.NullReferenceException: '未設定物件變數或 With 區塊變數。'
應該是指 aFunc 沒有建立執行個體, = Nothing,
要確認 CreateInstance(帶入的命名空間與類別名稱是否正確),

C# 的 object magicClassObject = magicConstructor.Invoke(new object[] { });
直接翻 VB.NET: Dim magicClassObject As Object = magicConstructor.Invoke(New Object())

僅供參考.
本篇文章回覆於2019-09-24 11:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

P陳
檢舉此回應
這是一字不差的COPY 過來的,麻煩您助看一下,有沒有那媬糷F,Debug.print "KKKK"沒有出來


本篇文章回覆於2019-09-24 11:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

Ader Chen
檢舉此回應

關於 CreateInstance:
https://docs.microsoft.com/zh-tw/dotnet/api/system.reflection.assembly.createinstance

其中(中文翻譯有點不順)提到:
如果執行時間Assembly在實例中找typeName不到,它null會傳回,而不是擲回例外狀況。 發生這種情況的原因可能是:
* 您尚未指定類型的完整名稱。
* 您已指定完整的類型名稱,但其大小寫不符合類型Type.FullName屬性的大小寫。 如需typeName以類型的完整名稱進行不區分大小寫比較,請CreateInstance(String, Boolean)呼叫多載, true並針對ignoreCase引數指定。
* 類型不存在於目前Assembly的實例中。

本篇文章回覆於2019-09-24 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

P陳
檢舉此回應
以下這句 Asm 有產生值
Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(DllPath) '動態載入 dll.

以卜下這句 afunc 沒有產生值 = nothing
Dim aFunc As Object = Asm.CreateInstance("Dll1.Class1") '建立類別執行個體.

本篇文章回覆於2019-09-24 11:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

P陳
檢舉此回應
我的程式在您的電腦上可以運作嗎?
本篇文章回覆於2019-09-24 11:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

Ader Chen
檢舉此回應

加幾個字就成功了.
改這一行:

CreateInstance(傳入 dll檔名.命名空間.類別名稱)
本篇文章回覆於2019-09-24 12:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

P陳
檢舉此回應
找到原因了

Dim aFunc As Object = Asm.CreateInstance("Dll1.Dll1.Class1") <---全名
10 20 有回傳30 且有Debug.print KKKK ebug.print KKKK 出來了

謝謝

本篇文章回覆於2019-09-24 12:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

Ader Chen
檢舉此回應

更正一下:
CreateInstance(傳入 命名空間.類別名稱) 才對,
在您 dll 專案按 F2 顯示 物件瀏覽器 視窗,
會發現您 Class1 的命名空間是 "Dll1.Dll1",
所以 命名空間.類別名稱 = "Dll1.Dll1.Class1"

本篇文章回覆於2019-09-24 12:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.