重命名.exe和.Config文件时出现Spring.Net TypeLoadException

本文关键字:Spring Net TypeLoadException exe Config 文件 重命名 | 更新日期: 2023-09-27 18:19:58

我使用Spring.Net构建了一个应用程序。我遇到了一个需要重命名可执行文件的场景。我认为最简单的方法是重命名.exe及其.config文件,但这会在ContextRegistry.GetContext()期间导致TypeLoadException

以下是结构:

-Release
|-Library.dll
|-MyApp.exe
|-MyApp.exe.Config
|-SpringConfigFile.xml

在SpringConfigFile中,我有:

<object id="ObjFromLibrary" type="Library.SomeType, Library">
  <!-- properties go here -->
</object>
<object id="ObjFromMyApp" type="MyApp.SomeOtherType, MyApp">
  <!-- properties -->
</object>

(当然,这是简化的,我有许多对象的类型源自MyApp程序集)

异常显示:

Error creating context 'spring.root': Could not load type from string value 'MyApp.SomeOtherType, MyApp'. ---> Spring.Core.CannotLoadObjectTypeException: Cannot resolve type [MyApp.SomeOtherType, MyApp] for object with name 'ObjFromMyApp' defined in file Release'SpringConfigFile.xml] line 5 ---> System.TypeLoadException: Could not load type from string value 'MyApp.SomeOtherType, MyApp'.

这基本上表明Spring创建对象ObjectFromLibrary没有问题,但在ObjFromMyApp上失败了(在我的"真实世界"应用程序中,ObjFromMyApp是第一个依赖于MyApp的对象,而不是另一个dll)

我的问题是,有没有一种方法可以轻松地重命名this.exe,而不让Spring加载失败?我知道我可以用一个新名称重新构建项目,并重构SpringConfigFile.xml以使用新程序集,但我更喜欢不进行重新构建。如果这需要对项目进行一次重构,以便以后可以对其进行重命名,那么这也是可以接受的。

另一个更哲学的问题是,我是否应该期望重命名.exe文件以导致.NET程序停止工作?

重命名.exe和.Config文件时出现Spring.Net TypeLoadException

我知道我可以用一个新名称重新构建项目,并重构SpringConfigFile.xml使用新程序集,但我更愿意这样做无需重建。

您不需要重新生成项目。仅修改SpringConfigFile.xml的内容,使其使用程序集的新名称。

另一个更具哲学意义的问题是,我是否应该将.exe文件导致.NET程序停止工作?

这将完全取决于这个程序是如何设计的以及它在做什么。正如您在案例中已经发现的那样,Spring.NET使用到实际类型的运行时绑定,如果在其中声明此类型的程序集被修改,它将破坏配置。

因此,基本上您需要同时执行xml配置文件的更新和可执行文件的重命名。

我不确定Spring.NET是否支持fluent API来配置您的容器,但其他一些DI框架(如Ninject)确实支持,并且对此类重命名更稳定,因为容器设置是用代码而不是一些弱类型的魔术字符串XML进行的。