Kar*_*ták 4 .net c# appdomain assembly.reflectiononly .net-assembly
在我们的应用程序(具有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检查程序集时,它们没有任何错误(很明显)。
在这一点上,我真的迷路了,不知道如何解决这个问题。
任何帮助表示赞赏。
谢谢
回答我自己的问题:
当引发异常时,我上了堆栈跟踪并列出了在创建的子AppDomain中加载的程序集:
AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()
{System.Reflection.RuntimeAssembly[15]}
...
[13]: {System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
[14]: {System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
Run Code Online (Sandbox Code Playgroud)
并注意到两个版本的System.Data程序集。该方法的参数类型为System.Data.IDbTransaction。
在针对.NET Framework 3.5的项目中引用了第一个。将其更改为4.0后,一切正常。
多么愚蠢的问题...
| 归档时间: |
|
| 查看次数: |
5896 次 |
| 最近记录: |