2012-08-09 48 views
6

基本上我試圖通過名稱調用一個DLL,實例化一個對象,然後通過名稱在該DLL中調用一個方法。我得到了「調用目標引發的異常」。在Method.Invoke期間。我很確定我的問題是對方法的參數進行類型轉換。我想知道是否有人對此例外有任何意見。另外,歡迎任何關於如何修改我的方法的建議。動態調用一個DLL和參數​​的方法

public void calldll(string dllName, string typeName, string methodName, string arguments) { 

    string[] argumentArray = arguments.Split(new char[] { '|' }, StringSplitOptions.None); 

    Assembly assembly = Assembly.LoadFrom(dllName); 
    System.Type type = assembly.GetType(typeName); 
    Object o = Activator.CreateInstance(type); 
    MethodInfo method = type.GetMethod(methodName); 
    ParameterInfo[] parameters = method.GetParameters(); 

    object[] methodParameters = new object[parameters.GetLength(0)]; 

    for (int i = 0; i < parameters.Length - 1; i++) 
    { 
     var converter = TypeDescriptor.GetConverter(parameters[i].GetType()); 
     methodParameters[i] = converter.ConvertFrom(argumentArray[i]); 
    } 

    method.Invoke(o, methodParameters); } 
+0

或者我已經嘗試通過刪除「Object o = Activator.CreateInstance(type);」來調用靜態dll方法,並更改爲「method.Invoke(null,methodParameters);」拋出同樣的異常。 – crlanglois 2012-08-09 15:53:35

回答

4

我發現了兩個問題與您的代碼:

  1. 你是不是遍歷所有parameters。您應該從for循環中刪除-1
  2. 當您創建轉換器時,請致電GetType()方法。這會返回ParameterInfo對象的Type,而不是參數的Type。改爲使用屬性ParameterType

總而言之,在for循環的第一行改成這樣:

for (int i = 0; i < parameters.Length; i++) 
{ 
    var converter = TypeDescriptor.GetConverter(parameters[i].ParameterType); 

一旦你完成了這些修正,我相信你的代碼應該運行按預期。至少在我測試了簡單的void Hello(int x, string y)方法時,它確實適用於我。