2012-08-09 23 views
6

Về cơ bản tôi đang cố gắng gọi một dll theo tên, khởi tạo một đối tượng, sau đó gọi một phương thức theo tên trong dll đó. Tôi nhận được một "ngoại lệ đã được ném bởi mục tiêu của một lời kêu gọi." trong Method.Invoke. Tôi khá chắc chắn vấn đề của tôi là với typecasting của các đối số của phương pháp. Tôi đã tự hỏi nếu có ai có bất kỳ đầu vào về ngoại lệ này. Ngoài ra, mọi đề xuất về cách sửa đổi cách tiếp cận của tôi đều được hoan nghênh.Tự động gọi một dll và phương thức với các đối số

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

Cách khác là tôi đã thử gọi các phương thức dll tĩnh bằng cách xóa "Object o = Activator.CreateInstance (type);" và thay đổi thành "method.Invoke (null, methodParameters);" với cùng một ngoại lệ bị ném. – crlanglois

Trả lời

4

tôi thấy hai vấn đề với mã của bạn:

  1. You are not Looping trên tất cả parameters. Bạn nên xóa -1 khỏi vòng lặp for.
  2. Khi bạn tạo trình chuyển đổi, bạn gọi phương thức GetType(). Điều này trả về Type đối tượng ParameterInfo, không phải là thông số Type của thông số. Sử dụng thuộc tính ParameterType để thay thế.

Tất cả trong tất cả, thay đổi dòng đầu tiên trong for vòng lặp như sau:

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

Một khi bạn đã thực hiện những điều chỉnh, tôi tin rằng mã của bạn nên chạy như dự định. Ít nhất nó đã làm cho tôi khi tôi thử nghiệm một phương pháp đơn giản void Hello(int x, string y).

Các vấn đề liên quan