【问题标题】:Could not load file or assembly Castle.Windsor无法加载文件或程序集 Castle.Windsor
【发布时间】:2010-12-10 15:49:23
【问题描述】:

您好,我尝试在我的 WPF 应用程序中使用 WindsorContainer。我从这个站点下载了 dll-s:http://stw.castleproject.org/Windsor.MainPage.ashx。 WPF 基于 .NET Framework 4.0 所以我添加了

  1. Castle.Core 和
  2. .NET 4.0 的 Castle.Windsor。

我的项目我参考了这个 Caliburn dll-s:

  1. Caliburn.Castle
  2. Caliburn.Core
  3. Caliburn.PresentationFramework 全部用于 .NET 4.0

Microsoft.Practices.ServiceLocator 适用于 2.0 版。

我的代码是这样的:

App.cs

public partial class App : CaliburnApplication
{
    private IWindsorContainer _container;

    public App()
    {
        RegisterComponents();
    }

    protected override IServiceLocator CreateContainer()
    {
        _container = new WindsorContainer();
        return new WindsorAdapter(_container);
    }

    protected override object CreateRootModel()
    {
        return _container.Resolve<IShellViewModel>();
    }

    protected void RegisterComponents()
    {
        _container.Register(Component.For<IShellViewModel>()
                                     .ImplementedBy<ShellViewModel>()
                                     .LifeStyle.Singleton);
    }

}

App.xaml

<am:CaliburnApplication 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:am="clr-namespace:Caliburn.PresentationFramework.ApplicationModel;assembly=Caliburn.PresentationFramework"
    x:Class="Spirit_Messenger.App">
    <am:CaliburnApplication.Resources>
    </am:CaliburnApplication.Resources>
</am:CaliburnApplication>

当我尝试编译我的项目时,我得到了这个错误:

无法加载文件或程序集“Castle.Windsor,Version=2.1.0.0,Culture=neutral,PublicKeyToken=407dd0808d44fbdc”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

StakTrace:

*在 Spirit_Messenger.App.CreateContainer() 在 Caliburn.PresentationFramework.ApplicationModel.CaliburnApplication..ctor() 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec__Messenger\Spirit_Messenger\App.xaml.cs:line 15 中的 Spirit_Messenger.App..ctor() 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec__Messenger\Spirit_Messenger\obj\x86\Release\App.g.cs:line 50 中的 Spirit_Messenger.App.Main() 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart()*

我是 WPF / IoC-DI 的新手,哪里有问题。我很困惑。感谢您的帮助。

【问题讨论】:

    标签: wpf castle-windsor


    【解决方案1】:

    这有时是一种痛苦。使用 ILDASM 检查其他 DLL 需要的 Castle 版本,我敢打赌它们与您拥有的不同。

    我通过下载并针对我拥有的版本重新编译开源代码解决了我的问题。


    使用 ILDASM 查看程序集的引用:

    • 使用 ILDASM 打开 DLL
    • 扩展树
    • 点击清单
    • 在页面顶部,您可以看到参考资料。例如,这里是 FluentNHibernate.DLL 的程序集的 sn-p:

      // 元数据版本:v2.0.50727 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z\V.4.. .ver 2:0:0:0 } .assembly extern NHibernate { .publickeytoken = (AA 95 F2 07 79 8D FD B4) // ....y... .ver 3:0:0:2001 } .assembly extern System.Core { .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z\V.4.. .ver 3:5:0:0 } .assembly 外部 System.Xml { .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z\V.4.. .ver 2:0:0:0 } .assembly extern System.Data { .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z\V.4.. .ver 2:0:0:0 } .汇编外部系统 { .publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z\V.4.. .ver 2:0:0:0 } .assembly extern Iesi.Collections { .publickeytoken = (AA 95 F2 07 79 8D FD B4) // ....y... .ver 1:0:1:0 } .assembly extern System.Configuration { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: .ver 2:0:0:0 }

    【讨论】:

    • 您好,我在程序集 Castle.Widsor.dll 上使用 ildasm,在清单中我看到://元数据版本:v4.0.30319 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } 我不擅长 CIL,但我认为这个程序集适用于 CLR 4.0。我是对的?
    • 不,ILDASM 在其他使用 Windsor 的组件上。一个使用一个版本,另一个使用另一个版本。
    • 我在 Castle.Windsor.dll 上使用 ildasm !其他程序集没有。
    • Caliburn.Castle, Caliburn.Core, ... 的 ILDASM 结果是什么?您当前的 Castle dll 的版本是什么?
    • 所有城堡 dll 都是运行时 4.0,我认为问题出在其他地方
    猜你喜欢
    • 2020-08-17
    相关资源
    最近更新 更多