我试图理解Assembly.Load和Assembly.ReflectionOnlyLoad之间的区别.
在下面的代码中,我试图找到从给定接口继承的给定程序集中的所有对象:
var myTypes = new List<Type>();
var assembly = Assembly.Load("MyProject.Components");
foreach (var type in assembly.GetTypes())
{
if (type.GetInterfaces().Contains(typeof(ISuperInterface)))
{
myTypes.Add(type);
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码对我来说很好,但我正在研究其他可能更好的替代方案,并遇到了Assembly.ReflectionOnlyLoad()方法.
我假设因为我没有加载或执行任何对象,基本上只是查询他们的定义我可以使用ReflectionOnlyLoad来略微提升性能......
但事实证明,当我将Assembly.Load更改为Assembly.ReflectionOnlyLoad时,我调用assembly.GetTypes()时会收到以下错误:
Run Code Online (Sandbox Code Playgroud)System.Reflection.ReflectionTypeLoadException:
无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.
我假设上面的代码只是做反射和"查看"库...但是这是Heisenberg不确定性原理的某种实例,通过查看库和它中的对象实际上是试图在某些实例化它们办法?
谢谢,马克斯
我正在尝试通过挂钩AppDomain.AssemblyResolve
和AppDomain.ReflectionOnlyAssemblyResolve
事件来加载一些模块.虽然我让前者工作,但我对后者失败了.我把问题归结为这个小程序:
public static class AssemblyLoader
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve +=
ReflectionOnlyAssemblyResolve;
// fails with FileNotFoundException
Assembly.ReflectionOnlyLoad("Foo");
}
public static Assembly ReflectionOnlyAssemblyResolve(object sender,
ResolveEventArgs args)
{
Trace.TraceInformation(
"Failed resolving Assembly {0} for reflection", args.Name);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
运行此程序失败,FileNotFoundException
尝试时Assembly.ReflectionOnlyLoad
,但它不会调用ReflectionOnlyAssemblyResolve处理程序.我很难过.
有没有人知道这可能是什么原因以及如何让它发挥作用?
谢谢!
我正在尝试将Silverlight支持添加到我最喜欢的编程语言Nemerle中.
Nemerle,在编译过程中,主要通过两个步骤通过反射加载所有类型
1-)使用Assembly.LoadFrom加载程序集2-)使用Assembly.GetTypes()来获取类型
然后在编译结束时,它使用Reflection.Emit发出已解析的类型.
此过程适用于所有程序集,包括除Silverlight的mscorlib之外的Silverlight程序集.
在c#中,这失败了:
var a = System.Reflection.Assembly.LoadFrom(@"c:\mscorlib.dll");
Run Code Online (Sandbox Code Playgroud)
但这传递了:
var a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"c:\mscorlib.dll");
Run Code Online (Sandbox Code Playgroud)
Bu在后者中,a.GetTypes()抛出一个异常,说System.Object的父节点不存在.
有出路吗 ?
silverlight reflection.emit nemerle mscorlib assembly.reflectiononly
在我们的应用程序(具有65个项目的解决方案)中,将在运行时分析所有引用的程序集是否存在Ninject模块(也应用了一些过滤)。这些模块稍后会加载到Ninject内核中,并且每个模块都声明该内核的绑定。
我们采用了一种加载程序,该加载程序以“仅反射”模式将引用的程序集加载到单独的程序集中。与Ninject可以从目录中加载程序集的方式的不同之处在于,该目录可以包含带有不应加载的模块的程序集。而且从一开始,并不是所有引用的程序集都已加载。
问题在于,加载程序(贷给Sacha Barber)无法加载带有
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information
Run Code Online (Sandbox Code Playgroud)
并LoaderExceptions
带有一个条目:
Method 'BeforeLoad' in type 'Lekis.AppBase.Core.BLLBaseCore' from assembly 'AppBaseCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
Run Code Online (Sandbox Code Playgroud)
以下是一些“有趣”的事实:
BeforeLoad
是虚拟的,并且是接口方法的实现AppBaseCore
是.NET 3.5,并且3个程序集无法加载AppBaseCore
是.NET 4和5程序集加载失败当我使用ILSpy和ILDAsm检查程序集时,它们没有任何错误(很明显)。
在这一点上,我真的迷路了,不知道如何解决这个问题。
任何帮助表示赞赏。
谢谢
c# ×3
.net ×2
appdomain ×1
assemblies ×1
clr ×1
mscorlib ×1
nemerle ×1
reflection ×1
silverlight ×1