重命名.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程序停止工作?
我知道我可以用一个新名称重新构建项目,并重构SpringConfigFile.xml使用新程序集,但我更愿意这样做无需重建。
您不需要重新生成项目。仅修改SpringConfigFile.xml的内容,使其使用程序集的新名称。
另一个更具哲学意义的问题是,我是否应该将.exe文件导致.NET程序停止工作?
这将完全取决于这个程序是如何设计的以及它在做什么。正如您在案例中已经发现的那样,Spring.NET使用到实际类型的运行时绑定,如果在其中声明此类型的程序集被修改,它将破坏配置。
因此,基本上您需要同时执行xml配置文件的更新和可执行文件的重命名。
我不确定Spring.NET是否支持fluent API来配置您的容器,但其他一些DI框架(如Ninject)确实支持,并且对此类重命名更稳定,因为容器设置是用代码而不是一些弱类型的魔术字符串XML进行的。