我有我动态加载的类(使用mef),它们是某种处理程序(这些工作正常)。加载未知类型
这些处理程序可以接收(有一种方法可以接收数据包并返回一个数据包),这些数据包都实现相同的接口(比如IPacket)并返回一个答案(IPacket)。我通过tcp连接接收这些数据包,我的程序不熟悉特定的类(虽然它是一个已知的接口 - IPacket,但是不同的实现)。
所以,当我试图反序列化一个数据包(把它交给处理程序)时,我得到一个异常。
- 我串行化为字节的反序列化回对象(使用二进制序列)*
我可以访问该数据包的实现应该是动态的,唯一的方法,因为DLL被存储在文件夹中我可以访问。
我认为我可以使用Assembly.LoadFrom来熟悉我的程序和数据包,因为我甚至不需要安装它们,只需反序列化(获取接口的一个实例)并交给处理程序,然后将返回一个答案,我会再次发送。
但它没有工作..
我认为我需要找到一种方法,在运行时,然后我的程序会识别它们添加到这些DLL的参考。(我想,也许使用出口(typeof运算()..)对包类要帮忙的,不是吗?)
尝试反序列化的是,类名没有找到时,我得到的例外..
* I编辑了这个话题,我希望它更清楚一点,谢谢=]
- 编辑:
我不是说这是可解的MEF的,我只是虽然它可能是。 这绝对可以用反射来解决。我有一个文件夹,其中包含我希望我的程序在运行时识别的所有类,我只需要在运行时“加载”它们,就好像我已经在同一个文件夹中添加了对dll的引用。
所以基本上我需要做的是:
从文件夹中加载某个接口(IPacket在这个例子中)所有的实现。我不需要实例化它们,但只需将它们作为变量接收,而不会收到这种类型不在我的项目中的异常。
所以我发现这个片断:
static constructor() {
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
Assembly ayResult = null;
string sShortAssemblyName = args.Name.Split(',')[0];
Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ayAssembly in ayAssemblies) {
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
ayResult = ayAssembly;
break;
}
}
return ayResult;
}
这似乎是接近我所期待的,但我真的不明白这一点。 有没有办法中和这个,以便它只加载某个文件夹中的dll? 我的程序会不会熟悉dll?
此外,代码的解释将不胜感激。
你正在使用什么解串器?你有什么确切的例外? –
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –
你能多解释一下吗?您正在导出该类型,但未由MEF加载或发生了什么? –