2010-07-23 58 views
2

的引用我有一個dll的完整路徑,但不是引用,我需要實例化一個實現了我定義的接口的對象。 我確實擁有對其他dll的控制權,所以我可以像dll那樣執行一些靜態函數來返回我需要的對象。我不知道如何調用這個函數,或者即使我正在接近這個權利。創建一個在dll中定義的對象,我沒有

回答

2

您需要手動加載該程序集,然後使用反射來找到並執行你感興趣的方法Here's an article.

有趣的來電/該條聲明:

  • 調用Assembly.Load()讓運行時將程序集加載到AppDomain中(使其成員可調用)。

  • 在搜索包含在組件中的Type小號

  • 建築MethodInfoConstructorInfo對象,這是用於調用一個方法或實例化一個實例的反射成分,分別

  • MethodInfo調用.Invoke()ConstructorInfoInvoke()實質上是在告訴Reflection來執行相應的方法。

0

您可以在運行時加載組件,並使用System.Activator或reflection來實例化該組件中的類型。如果你正在尋找一個實例的類型沒有默認的構造函數,那麼你必須傳遞正確的參數。這可能是棘手的問題,但如果類型很容易構建(使用相同的方法),這也很簡單。 如果您正在調用構造此類型的方法,那麼它將在成功時返回對象。 我懷疑你指的接口不是嚴格的.Net接口,而是一組訪問類型的公共方法。你也可以使用反射來調用這些。

0

下面是我使用的一段代碼,剝離了公司特定的內容。一旦你加載了程序集(如果這段代碼爲你加載程序集,我記不起頭腦),這是一種享受。

public static IMyType GetInstanceOfMyType() 
{ 
    var myTypeDescriptor = "My.Fully.NameSpaced.TypeName, My.Assembly.Name, Version=1.0.0.0, Culture=neutral" 

    IMyType _instance = null; 

    try 
    { 

    var myType = Type.GetType(myTypeDescriptor, true, true); 
    if (inst.GetInterface("IMyType") != null) 
    { 
     // For a constructor that takes a single parameter, that's a string 
     var constructorInfo = myType.GetConstructor(new Type[] { typeof(string) }); 
     _instance = (IMyType)constructorInfo.Invoke(new object[] { "String to Pass To Constructor" }); 

    } 
    else 
    { 
     // Type isn't correct, complain here. 
    } 
    } 
    catch (Exception ex) 
    { 
     // Log any errors here 
    } 

    return _instance; 
} 

的「任何錯誤」通常是一個:

  • 你已經在myTypeDescriptor命名不存在
  • 你已經在myTypeDescriptor命名類型不類型實現IMyType
  • 您在myTypeDescriptor中命名的類型沒有與您在調用GetConstructor時指定的類型相匹配的構造函數
  • 構造函數拋出異常;如果是這樣,它可以在ex.InnerException
+0

道歉發現它在VB.net是,你可能有一點小麻煩,改成VB.net,因爲它沒有做什麼特別神祕=) – Rob 2010-07-23 14:18:13

+0

沒有任何問題,我一般更喜歡C#。這個項目恰好在VB中。 – JupiterP5 2010-07-23 15:35:41

相關問題