2014-12-25 3 views
0

Я получаю все «Им» из проекта A в B проекта согласно приведено вИсключение было выбрано целью вызова. В C#

C# Get form names of project A from Project B

и я использую @jerry «s ответ.

, когда мой код достиг var f = (Form)emptyCtor.Invoke(new object[] { }); строка Я получаю Исключение было выбрано целью вызова Ошибка.

ниже полный код

try 
{ 
    Assembly projectA = Assembly.Load("ProjectA"); // replace with actual ProjectA name 
    // despite all Microsoft's dire warnings about loading from a simple name, 
    // you should be fine here as long as you don't have multiple versions of ProjectA 
    // floating around 

    foreach (Type t in projectA.GetTypes()) 
    { 
     if (t.BaseType == typeof(Form)) 
     { 
      var emptyCtor = t.GetConstructor(Type.EmptyTypes); 
      if (emptyCtor != null) 
      { 
       var f = (Form)emptyCtor.Invoke(new object[] { }); 
       // t.FullName will help distinguish the unwanted entries and 
       // possibly later ignore them 
       string formItem = t.FullName + " // " + f.Text + " // " + f.Name; 
       checkedListBox1.Items.Add(formItem); 
      } 
     } 
    } 
} 
catch(Exception err) 
{ 
    // log exception 
} 

меня обыскали причину ошибки, но потерпел неудачу. пожалуйста, предложите мне, что мы я worng

EDIT:

ниже подробности об ошибках

Изображение 1 Error1

Изображение 2

Err2

+1

Есть ли ошибки InnerException по ошибке? – dewaffled

+0

Существует StackTrace в InnerException - вы могли бы лучше понять, что не так, изучив его – J0HN

+2

@ J0HN Трассировка стека InnerException указывает, что исключение генерируется конструктором 'FrmMachineryType'. Кажется, у вас также есть информация об отладке (файлы '.pdb') для этой сборки, а трассировка стека должна содержать номер строки, которая генерирует исключение. Если у вас есть доступ к исходному коду, вы можете проверить, что вызывает ошибку. Вероятно, конструктор форм пытается получить доступ к некоторому статическому объекту, который не был создан. – dewaffled

ответ

2

Попробуйте это:

var f = (Form)emptyCtor.Invoke(null); 

BTW, что вы пытаетесь достичь?

2
private void childclick(object sender, EventArgs e) 
{ 
    DataTable dtTrans = new DataTable(); 
    dtTrans = Db.bindData("SELECT frm_Code FROM tbl_MST_SubMnu WHERE frm_Name='" + sender.ToString() + "'"); 

    Assembly frmAssembly = Assembly.LoadFile(Application.ExecutablePath); 
    foreach (Type type in frmAssembly.GetTypes()) 
    { 
     if (type.BaseType == typeof(Form)) 
     { 
      if (type.Name == dtTrans.Rows[0][0].ToString()) 
      { 
       Form frmshow = (Form)frmAssembly.CreateInstance(type.ToString()); 

       frmshow.Show(); 
      } 
     } 
    } 
} 
Смежные вопросы