我们有一个类似的场景,在多个环境中使用 WPF ClickOnce 应用程序,其中 app.config 中唯一的东西是一个连接字符串。
为了解决这样一个事实,即如果没有为每个客户端/环境构建一个包的构建过程,您就无法更改 clickonce 包中的配置文件,我们提出了一种解决方案,可让您将 app.config 文件放置在服务器部署文件夹中并让应用程序在运行时访问它。
为此,我们创建了一个在 app.xaml.cs OnStartup 事件中初始化的静态类。
公共静态类 DbConnectionString { 公共静态字符串 ConnectionString { 获取;私人套装;} 公共静态字符串 ActivationPath { 获取;私人套装;}
public static void Init()
{
string dbContext = "myDbContext";
string configFile = "App.config";
ConnectionString = "";
ActivationPath = "";
ActivationArguments actArg = AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
if (actArg != null)
{
if (actArg.ActivationData != null)
{
try
{
var actData = actArg.ActivationData[0];
var activationPath = Path.GetDirectoryName(new Uri(actData).LocalPath);
var map = new System.Configuration.ExeConfigurationFileMap();
map.ExeConfigFilename = Path.Combine(activationPath, configFile);
var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var connectionStringSection = config.ConnectionStrings;
ConnectionString = connectionStringSection.ConnectionStrings[dbContext].ConnectionString;
ActivationPath = activationPath;
}
catch (Exception)
{
ConnectionString = "";
ActivationPath = "";
}
}
}
}
}
在发布/选项/清单下的项目设置中,勾选“允许将 URL 参数传递给应用程序”
然后,我在需要连接字符串的地方使用静态类的 ConnectionString 属性。除非您仅将应用程序部署为在线,否则不会设置它,因此我们默认使用包中的 app.config 进行开发/测试。
这有点令人费解,但效果很好,您只需发布一次应用并为每次安装提供一个 app.config,在构建之间不会更改。
它还设置属性 ActivationPath,它是 clickonce 服务器安装目录的路径。