2011-11-07 88 views
0

[我已经张贴一些非常相似,但这个问题并不好,这里是我真的想知道]从DLL/Assembly获取实例?

我得到了下面的代码生成一个DLL:

public class MyObject : DependencyObject 
{ 
} 


public class Timer : DependencyObject 
{ 
} 

public class AnotherClass 
{ 
} 

public class Test 
{ 
    MyObject q1 = new MyObject(); 
    MyObject q2 = new MyObject(); 
    MyObject q3 = new MyObject(); 
    MyObject q4 = new MyObject(); 

    Timer t1 = new Timer(); 
    Timer t2 = new Timer(); 
    Timer t3 = new Timer(); 

    AnotherClass a1 = new AnotherClass(); 
    AnotherClass a2 = new AnotherClass(); 
    AnotherClass a3 = new AnotherClass(); 
    } 
} 

然后我会喜欢从我的DLL文件中提取实例。下面是我得到的那一刻:

var library = Assembly.LoadFrom(libraryPath); 

但后来,我还没有有关如何提取我的10个实例(4个MyObjects,3个定时器& 3 AnotherClasses)任何想法。我设法得到的唯一的事情就是4类(为MyObject,定时器,AnotherClass和测试)的代码:

IEnumerable<Type> types = library.GetTypes(); 

,但我觉得这不是我会得到我的10个实例的方式......

(PS:我甚至不能确定的10个实例包含在我的DLL文件...)

+2

你不能只是在消费项目中引用你的DLL,然后像使用任何其他类库一样使用它吗? –

+0

Nop,我可以,因为我会动态加载任何DLL在一个特定的文件夹:/ –

+0

是否有一个具体的原因,你这样做,而不是包括DLL为您的项目的一部分? –

回答

2

您无法轻松获取给定类型的所有实例。这根本不存在,除了一些漂亮的硬核调试API(想想:SOS)。如果你需要这个,你应该考虑一些其他的,可管理的跟踪你的实例的方法(最好不要让它们保持活着,所以WeakReference)。

+0

+1有一些好的框架在那里管理外部对象,即MEF> http://mef.codeplex.com/ – MattDavey

1

您需要实例的Test一个实例。这些实例在你做之前不会存在。

现在,我怀疑你真的想要做的是有一个单身人士(由于多种原因皱眉设计模式)。然而,这是你会怎么做,如果你想它:

public class Test 
{ 
    private static Test instance_ = new Test(); 

    MyObject q1 = new MyObject(); 
    MyObject q2 = new MyObject(); 
    MyObject q3 = new MyObject(); 
    MyObject q4 = new MyObject(); 

    Timer t1 = new Timer(); 
    Timer t2 = new Timer(); 
    Timer t3 = new Timer(); 

    AnotherClass a1 = new AnotherClass(); 
    AnotherClass a2 = new AnotherClass(); 
    AnotherClass a3 = new AnotherClass(); 

    public Test Instance { get { return instance_; } } 
} 

现在,假设你让这些成员公开可用的,你可以在他们得到:

Test.Instance.a1; // etc... 

现在,我已经说过,单身人士通常不是一个好主意。最好从你的依赖模块中实例化你自己的Test实例并使用它。