2011-11-21 43 views
1

我有以下代碼:Activator.CreateInstance(字符串,字符串)拋出TypeLoadException

public static void Invoke(string assemblyName, string scheduledTaskExecutorName) 
{ 
    ObjectHandle objectHandle = Activator.CreateInstance(assemblyName, scheduledTaskExecutorName); 
    IScheduledTaskExecutor scheduledTaskExecutor = (IScheduledTaskExecutor)objectHandle.Unwrap(); 
    scheduledTaskExecutor.ExecuteScheduledTask(); 
} 

我有一個叫DummyScheduledTaskExecutor類,它看起來是這樣的:

public class DummyScheduledTaskExecutor : IScheduledTaskExecutor 
{ 
    public void ExecuteScheduledTask() 
    { 
     DummyTextFile.Text = "Success!"; 
    } 
} 

它駐留在其裝配程序集名稱(在程序集屬性中定義)爲Tests.WebApplication.Application.Unit

我對Invoke(string, string)調用如下:

ScheduledTaskInvoker.Invoke("Tests.WebApplication.Application.Unit", "DummyScheduledTaskExecutor"); 

試圖運行該代碼只是拋出一個TypeLoadException。我是否錯誤地表達了程序集或類型名稱,或者是其他事情正在發生?

回答

2

scheduledTaskExecutorName需要包含名稱空間。

嘗試在第二個參數中包含整個名稱空間。

我的例子:

namespace WindowsFormsApplication6 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      object obj = Activator.CreateInstance(null, "WindowsFormsApplication6.TestClass"); 
     } 
    } 
} 

namespace WindowsFormsApplication6 
{ 
    public class TestClass 
    { 

    } 
} 
+0

謝謝。在文檔中沒有任何地方表明我需要使用命名空間。我現在有一個IOException,所以你讓我感動了! – David

+0

如果您使用的是單例類的文件輸出,請確保在創建日誌記錄類之前使用lock(在您的class中爲 James

+0

好吧,儘管我在面前說了同樣的話,但我猜你已經清楚了。我會給你一個upvote,因爲當人們接受一個答案時,我不能忍受,但不要讚揚它。怎麼了,@David? –

0

的CreateInstance將假定組件已經加載。我的猜測實際上並非如此。您需要改用CreateInstanceFrom

編輯:那麼如果你知道程序集被加載,那麼它很可能是一個問題,您的參數CreateInstance。像現在一樣使用完全限定類型名稱而不是簡單類名稱。

+0

這是當前的程序集。我認爲這意味着它被加載? – David

相關問題