【发布时间】:2011-06-26 14:03:08
【问题描述】:
在我目前正在进行的项目中,我们有许多仅通过反射实例化的类,并且它们所属的程序集未被任何其他类引用。
此方案允许在运行时替换程序集以扩展/纠正前一个程序集的功能。请注意,在我们的特定情况下,无法使用 MarshalByRefObject,因此同一程序集的不同版本,暴露了具有相同名称但功能不同的类,最终被加载到同一个 AppDomain 中。
我举一个极其简化的例子:考虑下面的接口声明和控制台应用程序
public interface ISomeInterface
{
string getData();
}
class Program
{
static void Main(string[] args)
{
byte[] lastLibrary = null;
Assembly lastAssembly = null;
while (true)
{
byte[] theLibrary = File.ReadAllBytes("ClassLibrary1.dll");
if (lastLibrary == null || !theLibrary.SequenceEqual(lastLibrary))
{
lastAssembly = Assembly.Load(theLibrary);
}
ISomeInterface obj = lastAssembly.CreateInstance("ClassLibrary1.Class1") as ISomeInterface;
Console.WriteLine(obj.getData());
lastLibrary = theLibrary;
Thread.Sleep(1000);
}
}
}
以及以下接口实现(在单独的程序集中):
public class Class1 : ISomeInterface
{
public string getData()
{
return "someText";
}
}
正如预期的那样,如果我更改 ISomeInterface 的实现(例如,将“someText”更改为“someOtherText”)并将旧的 dll 替换为新的,则使用最新版本。不过,我想知道:这种机制对软件稳定性造成问题的可能性有多大?我的意思是,在我仅通过反射实例化这些类并且没有其他组件引用它们之前,一切是否安全?至于我们的初步测试,看起来一切正常,但我也想听听专家的意见。
我知道在这个特定的例子中,可以使用 MarshalByRefObject 来完成所有事情,但正如我之前所说,我们不可能朝那个方向前进。
【问题讨论】:
标签: c# reflection plugins