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

时间:2014-08-28 20:43:02

标签: c# .net spring.net

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

以下是结构:

-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的对象。 1}}而不是另一个dll)

我的问题是,有没有办法轻松重命名此.exe并且没有Spring无法加载?我知道我可以使用新名称重建项目并重构SpringConfigFile.xml以使用新程序集,但我更愿意在没有重建的情况下执行此操作。如果这需要重构项目一次,以便我以后可以重命名,那也是可以接受的。

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

1 个答案:

答案 0 :(得分:1)

  

我知道我可以用新名称重建项目并重构   SpringConfigFile.xml使用新的程序集,但我更喜欢这样做   没有重建。

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

  

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

这完全取决于该程序的设计方式和工作方式。正如您在已经发现的情况下发现的那样,Spring.NET使用运行时绑定到实际类型,如果声明了此类型的程序集被修改,它将破坏配置。

所以基本上你需要同时执行xml配置文件的更新和可执行文件的重命名。

我不确定Spring.NET是否支持流畅的API来配置您的容器,但其他一些DI框架(例如Ninject)肯定会对此类重命名更加稳定,因为容器设置是使用代码而不是某些弱类型的魔术字符串个XML。