我在尝试学习Castle Windsor的Fluent界面时写了以下简单的测试:
using NUnit.Framework; using Castle.Windsor; using System.Collections; using Castle.MicroKernel.Registration; namespace WindsorSample { public class MyComponent : IMyComponent { public MyComponent(int start_at) { this.Value = start_at; } public int Value { get; private set; } } public interface IMyComponent { int Value { get; } } [TestFixture] public class ConcreteImplFixture { [Test] public void ResolvingConcreteImplShouldInitialiseValue() { IWindsorContainer container = new WindsorContainer(); container.Register(Component.For().ImplementedBy ().Parameters(Parameter.ForKey("start_at").Eq("1"))); IMyComponent resolvedComp = container.Resolve (); Assert.AreEqual(resolvedComp.Value, 1); } } }
当我通过TestDriven.NET执行测试时,我收到以下错误:
System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'. at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()
当我通过NUnit GUI执行测试时,我得到:
WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue: System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.
如果我打开我在Reflector中引用的程序集,我可以看到它的信息是:
Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc
并且它肯定包含Castle.MicroKernel.Registration.IRegistration
会发生什么事?
我应该提一下,二进制文件是从最新版本的Castle中获取的,虽然我从来没有使用过nant所以我没有费心从源代码重新编译,只是将文件放在bin目录中.我还应该指出,我的项目编译没有问题.
如果您有一个项目引用另一个项目(例如"引用"类库"的"Windows应用程序"类型)并且两者具有相同的程序集名称,则会出现此错误.您可以强烈命名引用的项目,或者(甚至更好)重命名引用项目的程序集(在VS中的项目属性的"应用程序"选项卡下).
是全局程序集缓存(GAC)中的程序集还是可能覆盖您认为正在加载的程序集的任何位置?这通常是加载不正确的程序集的结果,对我而言,这意味着我通常在GAC中有一些东西覆盖了我在bin/Debug中的版本.
很抱歉疏通一个陈旧的问题,但上面没有提到我的解决方案,所以我想我会把我的答案添加到长尾......
我最终对web.config中的一个类(一个HttpHandler)有一个旧的引用,它不再被使用(并且不再是一个有效的引用).出于某种原因,它在Studio中运行时被忽略了(或者我的开发设置中仍然可以访问该类?)因此我尝试部署到IIS时只出现此错误.我在web.config中搜索了程序集名称,删除了未使用的处理程序引用,然后这个错误消失了,一切都很好.希望这有助于其他人.
我有同样的问题,对我而言,它与命名空间或项目命名无关.
但是,正如一些用户暗示它与旧的装配仍然被引用有关.
我建议删除所有项目的所有"bin"/二进制文件夹,并重新构建整个解决方案.这会淘汰任何可能过时的组件,然后MEF导出我的所有插件而没有问题.
我得到了这个错误,我在StackOverflow或其他地方发现的任何东西都没有解决它,但是bmoeskau对这个问题的回答指出了我正确的修复方向,这还没有被提及作为答案.我的答案与原始问题没有严格的关系,但是我在这里发布它是假设有人遇到这个问题会在这里通过搜索谷歌或类似的东西找到方法(就像我一个月后再次咬我一样) ,arg!).
我的程序集在GAC中,因此理论上只有一个版本的程序集可用. 除了 IIS有助于缓存旧版本并给我这个错误.我刚刚更改,重建并重新安装了GAC中的程序集.一种可能的解决方案是使用任务管理器来杀死w3wp.exe.这迫使IIS从GAC重新读取程序集:问题解决了.