我们正在尝试为我们的WCF服务动态加载KnownTypes
列表,当以这种方式加载类型列表时(它不起作用):
Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".dll") || s.EndsWith(".exe"))
.ToList()
.ForEach(d =>
{
try
{
Assembly assembly = Assembly.LoadFile(d);
assembly.GetTypes().Where(f => f.IsDefined(typeof(System.Runtime.Serialization.DataContractAttribute), true))
.Where(f => f.IsGenericType == false)
.Where(f => f.FullName.StartsWith("AES."))
.ToList()
.ForEach(t => copy.Add(t));
}
catch (Exception e)
{
exceptions.Add(d, e);
}
});
我们知道类型列表是通过日志记录生成的,但是会得到一个模糊的WCF端点错误。
如果我们以这种方式加载类型,它确实有效:
AppDomain.CurrentDomain.GetAssemblies().SelectMany(f => f.GetTypes())
.Where(f => f.IsDefined(typeof(System.Runtime.Serialization.DataContractAttribute), true))
.Where(f => f.IsGenericType == false)
.Where(f => f.FullName.StartsWith("AES."))
.ToList()
.ForEach(t => copy.Add(t));
这种方式没有问题,唯一的区别是使用AppDomain清单的程序集来探测是不同的。
我们得到相同的列表,唯一的区别(我们知道)是一种方式有效而另一种方式没有。
有什么见解?