none
動態載入dll內沒有預設建構函式 RRS feed

  • 問題

  • 小弟最近測試動態載入dll發現了一個問題
    當dll要內要建立的class沒有預設的建構函式時(也就是沒有任何的NEW sub),使用activator.createinstance實體化時,會一直擲出例外[TargetInvocationException 被呼叫的建構函式擲回例外狀況。]
    。(小弟試過靜態載入,使用正常,沒有這方面的問題)

    請教一下大師們,能否幫小弟解決一下,此問題該如何解決,謝謝(不變更dll內容下)
    2010年1月8日 上午 06:11

解答

  • Hi,

    我已經搞不懂了
    一開始問題是"當dll要內要建立的class沒有預設的建構函式時(也就是沒有任何的NEW sub),使用activator.createinstance實體化時,會一直擲出例外[TargetInvocationException 被呼叫的建構函式擲回例外狀況。]"

    後來回應"小弟確定過了,並沒有建位任何的new函數,小弟的認知也是應該會自動產生預設的建構函式(在沒有建立任何建構函式時)。"

    那一開始您怎麼區別有無預設建構子的?

    在你不確定有哪些建構子的狀況下是使用GetConstructors,不是用GetConstructor
    Type.GetConstructors Method

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年1月13日 上午 04:42

所有回覆

  • Hi,

    你是不是用錯方法了?



    若還是不行,程式貼出來,描述詳細些

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年1月8日 上午 06:40
  • 我是使用Activator.CreateInstance (Type) 沒錯,因為沒有建構函式,所以就用這個!!
    你所謂的
    Activator.CreateInstance (Type, Object[]) ,是建構函式中有傳入參數的這個嗎?
    2010年1月8日 下午 07:32
  • 你的類別中沒有半個建構式嗎?
    如果有其他的建構式,你就不能使用 Activator.CreateInstance(Type),因為 Compiler 不會自己產生預設建構式。
    只有在一個自訂的建構式都沒有時,才會產生一個無參數的預設建構式。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    2010年1月9日 上午 12:30
    版主
  • Hi,

    如朱大所言
    如果沒定義建構函式,編譯器會自動幫你產生預設建構函式
    這是不用傳參數的

    但如果有定義其他帶參數的建構函式
    又沒有自行建立無參數的建構函式
    編譯器就不會幫你產生預設的建構函式

    而你用的Activator.CreateInstance (Type)是不用帶參數的建立方式
    但你的建構子需要你帶入參數 
    程式不知道怎摸處理
    就會觸發TargetInvocationException例外
    中文錯誤訊息好像叫做引動過程發生錯誤
    這是當使用反射建立物件發生錯誤常會發生的例外

    在不更動dll的狀況下
    要解決這個問題
    你要知道該建構函式需要帶入的參數
    若所有有要帶參數的其參數都一樣
    你可以透過ConstructorInfoGetParameters 去判斷是否須帶入參數
    若是參數都不一樣
    那可能只可以自行用if判斷個別處理
    要是你不是要把組件中所有類別都建立
    只要建立單一類別實體的話
    那就直接改用Activator.CreateInstance (Type, Object[]) 就可了

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年1月9日 上午 03:04
  • 蹂躪大,又來打擾~~= =||
    關於朱大的回覆,小弟確定過了,並沒有建位任何的new函數,小弟的認知也是應該會自動產生預設的建構函式(在沒有建立任何建構函式時)。
    在靜態使用 dim obj as object=new object() 是正常無誤的。
    但動態就是不能使用無參數的作法
    Activator.CreateInstance (Type) 觸發TargetInvocationException例外
    這部分再麻煩一下,能否幫得上忙。

    順便再請教一下,蹂躪大所提出的 Constructorinfo內的GetParameters小弟不是很懂(這個好要像先知道參數的數量和型別才能用?
    Consructorinfo內有一個參數types 好像就是得要知道這些資訊才能動作??)
    types

    Type 物件組成的陣列,表示所要建構函式參數的數目、順序和型別。

    -或- 由 Type 物件組成的空陣列,用來取得不需任何參數的建構函式。這種供陣列是由 static 欄位 Type.EmptyTypes 提供的。

    範例上是把dim types(0) as type =gettype(integer)-不懂這部份的使用為何
    我的用法是用
    dim ConstructorinfoObj=obj.GetConstructor(Type.EmptyTypes)
    ConstructorinfoObj.Getparameters()
    回應的值為 Length=0
    不知道使用上對不對,不吝指教,謝謝



    2010年1月11日 上午 07:15
  • Hi,

    我已經搞不懂了
    一開始問題是"當dll要內要建立的class沒有預設的建構函式時(也就是沒有任何的NEW sub),使用activator.createinstance實體化時,會一直擲出例外[TargetInvocationException 被呼叫的建構函式擲回例外狀況。]"

    後來回應"小弟確定過了,並沒有建位任何的new函數,小弟的認知也是應該會自動產生預設的建構函式(在沒有建立任何建構函式時)。"

    那一開始您怎麼區別有無預設建構子的?

    在你不確定有哪些建構子的狀況下是使用GetConstructors,不是用GetConstructor
    Type.GetConstructors Method

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年1月13日 上午 04:42
  • 蹂躪大,不好意思!讓你有點錯亂了,小弟整理一下問題所在。

    本來要建立DLL內一個class的實體(此DLL是自己撰寫的),發現當時並沒有撰寫建構函式(new sub),使用參考方式建立時為正常的( dim obj=New Object()),同樣的DLL在動態載入時卻發生例外( Activator.CreateInstance (Type), [TargetInvocationException])。
    以上為主要問題,而小弟的認知也是沒有撰寫任何建構函式時,[編譯器會自動幫你產生預設建構函式], 我在動態載入時,卻發生找不到沒有參數的建構函式,這就是問題的徵節所在。在麻煩您幫小弟解答一下~感謝

    2010年1月13日 下午 01:01
  • Hi,

    所以您也不確定是否無預設建構子
    而是因為使用了Activator.CreateInstance (Type)會出問題
    才這麼覺得?
    您的dll內有無在變數初始器中,或是在靜態成員中初始任何東西?
    是否有需要跟路徑相關的資訊?
    若仍找不出問題,看看是否能做個類似的且會發生同樣問題的小專案給我們測試?

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年1月13日 下午 02:14