如何从运行时加载的程序集中定义ref-type变量?

时间:2010-03-22 15:19:03

标签: c# .net

我想定义一个ref类型变量,如下所示:

SomeType v=null;

这个“SomeType”在另一个程序集中定义,该程序集在运行时加载

Assembly asm=AppDomain.CurrentDomain.Load(...);

我知道如何创建“SomeType”对象,只需执行以下操作:

Object=asm.CreateInstance(...);

但是如何只定义一个ref-type变量呢?非常感谢......

4 个答案:

答案 0 :(得分:4)

为了在编译时定义类型,必须在编译时引用包含该类型的程序集。如果在运行时绑定,则无法定义该类型的项。如果要在运行时加载类型,则必须反映它以使用它。

但是,有一些选项可能会对您有所帮助。

我建议您从运行时绑定类型中提取一个接口,并将其放在一个可以在编译时绑定的单独程序集中。然后,您可以声明该接口的变量,并在没有反射的情况下对其进行处理,仅使用反射来创建类型。

例如:

// defined in MyFoo.Contract.dll, or something like that. Your code 
// references this assembly at compile time. 
public interface IMyFoo
{
   // members
}

// defined in MyFoo.dll, or something like that. Your code loads 
// this assembly at runtime. MyFoo.dll references MyFoo.Contract.dll
// at compile time.
public class MyFoo : IMyFoo
{
  // class def
}

// elsewhere...
Assembly asm = AppDomain.CurrentDomain.Load(...);
object myFooInstance = asm.CreateInstance(...);
IMyFoo myFoo = (IMyFoo)myFooInstance;

.NET 4中提供的另一个选项是使用dynamic关键字进行鸭子输入。这将允许您对没有编译时引用的项使用myFoo.MyMethod()语法。

例如:

dynamic myFoo = asm.CreateInstance(...);
myFoo.MyMethod(); 
// bound at runtime, but the compiler will allow it! No nasty 
// Invoke() calls. 

答案 1 :(得分:0)

您必须定义您正在构建的项目已知的某种基类或接口,并使运行时加载的类型实现众所周知的接口或从众所周知的基类继承。

答案 2 :(得分:0)

您有很多选择。正如Randolpho建议的那样,您可以通过引用它直接耦合到该类型。另一种选择是创建抽象,例如抽象类或接口,它是自己的程序集。然后,动态加载的和客户端程序集都可以使用抽象引用程序集,动态加载的类型实现接口,客户端类型向下转换为使用接口。

如果您只关心类型和引用而不关心接口,那么您只需要一个object类型的变量。

您的问题并不清楚您需要什么。

答案 3 :(得分:0)

一种解决方案是在编译时引用一个接口。然后,确保您在运行时引用的类型实现该接口。

然后你可以使用该接口编写代码,并且具有良好的编译时检查和简单编码,同时仍然能够动态加载其他类型!