试图打开另一个应用程序配置文件

Trying to open another's application configuration file

我正在使用 C# 和 .NET Framework 4.7 开发 WinForm 应用程序。

对于这个应用程序,我正在尝试从另一个应用程序加载配置文件:

string applicationName = Environment.GetCommandLineArgs()[1];

if (!string.IsNullOrWhiteSpace(applicationName))
{
    if (!applicationName.EndsWith(".exe"))
        applicationName += ".exe";

    string exePath = 
        Path.Combine(Environment.CurrentDirectory, applicationName);

    try
    {
        // Get the configuration file. The file name has
        // this format appname.exe.config.
        System.Configuration.Configuration config =
          ConfigurationManager.OpenExeConfiguration(exePath);

但是ConfigurationManager.OpenExeConfiguration(exePath)抛出异常:

An error occurred while loading the configuration file: The 'exePath' parameter is not valid.
Parameter name: exePath

配置文件 AnotherApp.exe.config 存在于文件夹 Environment.CurrentDirectory 中。我也尝试将其更改为 Path.Combine(@"D:\", applicationName);,但我得到了同样的异常。

如果我在这里的名称末尾添加 exe.config 而不是 .exeapplicationName += ".exe";,它似乎打开了一些东西:config.FilePathD:\AnotherApp.exe.config.config。但是 config 对象是空的。它没有填写任何 属性.

我做错了什么?

我已经从 Microsoft documentation 复制了代码。

在尝试打开 AnotherApp.exe.config 之前,ConfigurationManager.OpenExeConfiguration 检查磁盘上是否存在 AnotherApp.exe。这是 source:

// ...
else {
    applicationUri = Path.GetFullPath(exePath);
    if (!FileUtil.FileExists(applicationUri, false))
        throw ExceptionUtil.ParameterInvalid("exePath");

    applicationFilename = applicationUri;
}

// Fallback if we haven't set the app config file path yet.
if (_applicationConfigUri == null) {
    _applicationConfigUri = applicationUri + ConfigExtension;
}

如您所见,exePath 最终传递给 FileUtils.FileExists,最后检查 exePath 是否表示磁盘上的文件。在您的情况下,这是 AnotherApp.exe 不存在 throw ExceptionUtil.ParameterInvalid("exePath"); 语句是您的错误来源。

在我上面包含的源代码中,您可以看到 _applicationConfigUri 设置为 AnotherApp.exe.config(这是一个绝对路径,但为简单起见,我使用了相对路径)。当您将 exePath 设置为 AnotherApp.exe.config 时,代码最终会检查它找到的 AnotherApp.exe.config 是否存在(它认为这是 exe 本身)。此后,_applicationConfigUri 设置为 AnotherApp.exe.config.config 不存在 ,但在这种情况下配置系统不会出错(而是返回一个空配置对象) .

似乎有两种选择可以解决这个问题:

  1. 包括 AnotherApp.exeAnotherApp.exe.config
  2. 使用 ConfigurationManager.OpenMappedExeConfiguration,它允许您提供自己的 ExeConfigurationFileMap 来指示配置系统如何定位 .config 文件。如果您需要这方面的帮助,请告诉我,我将提供一个示例来说明它应该如何工作。