我有一个输出dll:foo.dll的C#项目。此foo.dll在内部使用旧版库legacy.dll。以下是我的库foo.dll的使用方法:首先我将这些文件:foo.dll,legacy.dll和legacy.dll.config上传到第三方;然后第三方启动一个进程,加载我的主库foo.dll并执行一些功能。当foo.dll运行时,我看到legacy.dll中抛出异常,说找不到某些配置“baz”。但是,我可以验证配置“baz”是否在legacy.dll.config文件中定义。所以我认为进程没有加载文件legacy.dll.config。
所以我想知道如何使用config.dll文件。在我的情况下,考虑到foo.dll是我控制范围内唯一的东西,有没有办法加载legacy.dll.config文件?
答案 0 :(得分:0)
一种解决方案是将配置文件(app.config或web.config)中的legacy.dll所需的配置部分放在引用它的应用程序中。
您是否可以控制您的遗留应用程序 - 换句话说,您是否可以修改它?偶然的一个挑战是,当所有这些额外值被转储到配置中时,可能更难以确定它们的使用位置。在您停止使用legacy.dll之后,它们甚至可以在配置中保留很长时间,因为没有人知道它们是什么,并且它们害怕将它们删除。
另一方面,如果配置中缺少值,最好不要抛出令人困惑的NullReferenceException
或配置异常,这需要有人深入研究遗留代码并弄清楚它为什么不起作用
其中一个是您的legacy.dll可以查找与您配置的其余部分不同且与其他配置分开的配置值。
这可能意味着单独的配置部分,如
<section name="stuffTheLegacyDllNeeds" type="Legacy.LegacySettingsConfiguration, Legacy" />
<stuffTheLegacyDllNeeds>
....
</stuffTheLegacyDllNeeds>
或者您可以使用某些约定来消除appSettings键的歧义,例如
<add key="myLegacyLibrary:someSetting" value="true" />
如果缺少必需的密钥,您还可以通过抛出有用的异常消息使其他开发人员更容易,例如“Legacy需要找不到appSettings键'xyz'。”他们仍然需要找出在哪里找到价值观,但至少他们对问题有清晰的认识。
此外,如果您发现Legacy.dll不经常或永远不会更改设置,您可以对其进行编码以使用默认值替换缺失值。这样他们可以在需要时覆盖默认值通过添加配置值。但如果他们不需要默认值,他们就不能提供配置值。
还有一种方法 - 这是我个人更喜欢的方法:
让遗留类依赖于设置界面,如
public interface ISettings
{
bool SomeSetting { get; }
int SomeOtherSetting { get; }
}
并使您的遗留类在其构造函数中需要ISettings
的实例。现在,引用它的应用程序“知道”有关设置的原因,因为它无法在不提供的情况下使用该类。您的旧库可以提供类似
public class ConfigurationSettings : ISettings
从配置读取,引用应用程序可以选择使用它。或者它可以提供另一个实现接口的类。它还可以提供一个包含引用应用程序可能更改的默认值的类。如果引用应用程序不提供任何值,它也可能具有一组内部使用的默认值。
现在,
ISettings
- 可以使用配置或其他方式实现。这意味着您的旧库将更容易进行单元测试。显式依赖于配置值的代码更难以测试,甚至可能永远不会被测试。