我有我动态加载的类(使用 mef),它们是某种处理程序(这些工作正常)。
这些处理程序可以接收(有一个接收数据包并返回一个数据包的方法)数据包,它们都实现了相同的接口(比如说IPacket)并返回一个答案(也是一个IPacket)。
我接收到这些数据包(通过 tcp 连接),而我的程序并不熟悉特定的类(虽然它是一个已知的接口 - IPacket,但不同的实现)。
因此,当我尝试反序列化一个数据包(将其交给处理程序)时,我得到了一个异常。
- 我序列化成字节反序列化回对象(使用二进制序列化程序)*
我可以访问数据包实现的唯一方法应该是动态的,因为 dll 存储在我可以访问的文件夹中。
我认为我可以使用 Assembly.LoadFrom 来让我的程序熟悉数据包,因为我什至不需要实例化它们,只需反序列化(获取接口的实例)并交给处理程序,其中然后会返回一个答案,我会再次发送。
但它没有工作..
我假设我需要找到一种方法在运行时添加对这些 dll 的引用,然后我的程序将识别它们..(我认为也许在包类上使用 Export(typeof()..) 会有所帮助,会它?)
尝试反序列化时遇到的异常是找不到类名..
*我已经编辑了主题,希望它更清楚一点,谢谢=]
- 编辑:
我并不是说这可以用 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 吗?
此外,非常感谢您对代码的解释。