为什么我在调用ContextRegistry.GetContext()时会收到来自Spring.NET的异常?

4

尽管这个解决方案是如此明显,我本不应该发布它,但我将其保留作为提醒和对他人有用的参考点。

以下是我的app.config文件中的内容:

<sectionGroup name="spring">
  <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
  <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>

接下来是:

<spring>
  <context>
    <resource uri="config://spring/objects"/>
  </context>
  <objects xmlns="http://www.springframework.net">
    <object name="mediaLibrary" type="AlbumLibraryWPF.AlbumLibrary, AlbumLibraryWPF"/>
  </objects>
</spring>

然后在我的应用程序中,我有:

using Spring.Context;
using Spring.Context.Support;

public partial class AlbumChecker : Window
{
    private DataTable dataTable;

    private Library library;
    private Thread libraryThread;

    public AlbumChecker()
    {
        InitializeComponent();

        CreateToolTips();

        IApplicationContext ctx = ContextRegistry.GetContext();
        library = (Library)ctx.GetObject("mediaLibrary");

        // Other initialisation
    }

    // Other code
}

所有的代码都能够很好地编译,但是,在调用GetContext()时,我遇到了一个异常:

Error creating context 'spring.root': Could not load type from string value
'AlbumLibraryWPF.AlbumLibrary, AlbumLibraryWPF'.

我已经查阅了Spring.NET文档,但并没有发现我做错了什么——但显然我肯定做错了什么,否则就不会引发异常了! AlbumLibraryWPF是命名空间,AlbumLibraryWPF.AlbumLibrary是我想实例化的类的完全限定名称。我猜测可能是这里出了问题,但是我无法确定具体错误在哪里。
6个回答

5
我感觉自己很傻。
这是因为我没有将AlbumLibrary.dll复制到正确的输出目录中。这意味着Spring找不到它,即使我已经解决了Kent指出的程序集名称问题。

我曾经遇到过完全相同的问题,因为我的项目输出指向不同的位置。将这些项目更改为将dll输出到相同的目录中,对我来说解决了一切。 - lomaxx

1
我之所以出现这个错误,是因为在app.config文件中不小心打错了[!*2]。一旦我把它删除了,错误就消失了。类似这样的事情。
<context>
  <!--<resource uri="~//Aspects.xml"/>-->
  <!--<resource uri="~//Dao.xml"/>-->
  <!--<resource uri="~//Spring.xml"/>-->
  <resource uri="file://Spring.xml"/>
  <resource uri="file://Dao.xml"/>
</context>

!*2


1

逗号后面的名称应该是程序集名称,这个名称不一定与命名空间名称相同。


几乎 - 这是因为我忘记将AlbumLibrary dll复制到正确的输出目录。 - ChrisF

0
你应该使用 id 属性而不是 name
<object id="mediaLibrary" type="AlbumLibraryWPF.AlbumLibrary, AlbumLibraryWPF"/>

同时,应该使用 config://spring/objects 而非 config://spring/obects

您需要仔细检查在 AlbumLibraryWPF 程序集中定义的 AlbumLibrary 类型是否在 AlbumLibraryWPF 命名空间中。


不行 - id 仍然导致异常被抛出。 - ChrisF
第二个错误是打错了 - 我试图剪切和粘贴代码,但Firefox声称我需要一个插件才能看到内容 - 所以我又重新输入了一遍。 - ChrisF

-1
  1. 以管理员权限打开VS2012或VS2010
  2. 配置:type="namespace.type, assembly"

然后再次尝试运行您的解决方案。


-1

您可以尝试更改类型。type="AlbumLibraryWPF.AlbumLibrary, AlbumLibraryWPF",第一个参数表示命名空间,第二个参数(点号后面)表示解决方案名称。

  • "AlbumLibraryWPF.AlbumLibrary" = 命名空间名称
  • "AlbumLibraryWPF" = 解决方案名称

不是解决方案名称,而是程序集名称,请更正您的答案。 - Marijn
type="namespace.type, assembly" - Marijn
2
虽然我很感激你的努力 - 但是我在2年半前就已经解决了这个问题。请查看我的答案并确认 ;) - ChrisF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接