试图打开另一个应用程序配置文件
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
而不是 .exe
,applicationName += ".exe";
,它似乎打开了一些东西:config.FilePath
是 D:\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
, 不存在 ,但在这种情况下配置系统不会出错(而是返回一个空配置对象) .
似乎有两种选择可以解决这个问题:
- 包括
AnotherApp.exe
和 AnotherApp.exe.config
。
- 使用
ConfigurationManager.OpenMappedExeConfiguration
,它允许您提供自己的 ExeConfigurationFileMap
来指示配置系统如何定位 .config
文件。如果您需要这方面的帮助,请告诉我,我将提供一个示例来说明它应该如何工作。
我正在使用 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
而不是 .exe
,applicationName += ".exe";
,它似乎打开了一些东西:config.FilePath
是 D:\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
, 不存在 ,但在这种情况下配置系统不会出错(而是返回一个空配置对象) .
似乎有两种选择可以解决这个问题:
- 包括
AnotherApp.exe
和AnotherApp.exe.config
。 - 使用
ConfigurationManager.OpenMappedExeConfiguration
,它允许您提供自己的ExeConfigurationFileMap
来指示配置系统如何定位.config
文件。如果您需要这方面的帮助,请告诉我,我将提供一个示例来说明它应该如何工作。