2011-11-21 48 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

相关问题