标签: assembly.reflectiononly

C#Assembly.Load vs Assembly.ReflectionOnlyLoad

我试图理解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()时会收到以下错误:

System.Reflection.ReflectionTypeLoadException:
Run Code Online (Sandbox Code Playgroud)

无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.

我假设上面的代码只是做反射和"查看"库...但是这是Heisenberg不确定性原理的某种实例,通过查看库和它中的对象实际上是试图在某些实例化它们办法?

谢谢,马克斯

c# reflection assembly.load assembly.reflectiononly

48
推荐指数
3
解决办法
3万
查看次数

为什么在尝试Assembly.ReflectionOnlyLoad时没有执行ReflectionOnlyAssemblyResolve?

我正在尝试通过挂钩AppDomain.AssemblyResolveAppDomain.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处理程序.我很难过.

有没有人知道这可能是什么原因以及如何让它发挥作用?

谢谢!

.net c# clr assemblies assembly.reflectiononly

8
推荐指数
1
解决办法
7954
查看次数

通过反射获取mscorlib 2.0.5.0(又名Silverlight mscorlib)中的类型?

我正在尝试将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

7
推荐指数
1
解决办法
1545
查看次数

在ReflectionOnly模式下将程序集加载到新的AppDomain中时,方法没有实现

在我们的应用程序(具有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检查程序集时,它们没有任何错误(很明显)。

在这一点上,我真的迷路了,不知道如何解决这个问题。

任何帮助表示赞赏。

谢谢

.net c# appdomain assembly.reflectiononly .net-assembly

4
推荐指数
1
解决办法
5896
查看次数