如何使用dll.config文件

时间:2017-12-30 15:11:18

标签: c# .net

我有一个输出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文件?

1 个答案:

答案 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 - 可以使用配置或其他方式实现。这意味着您的旧库将更容易进行单元测试。显式依赖于配置值的代码更难以测试,甚至可能永远不会被测试。