我有一些从我的应用程序中使用的库代码,也被 Visual Studio 安装程序项目中的 .NET 自定义操作使用。库代码反过来使用企业库日志记录块来进行日志记录。如何在 msiexec 中运行的自定义操作的上下文中将配置信息获取到企业库?在我对 EntLib 进行任何调用之前,是否可以在代码中引导配置机制?
更新:我制作了一个看起来可以工作但依赖于使用反射设置非公共静态字段的hack。EntLib 与 .NET ConfigurationManager 的耦合如此紧密,这是一种耻辱。
var factory = new LogWriterFactory( new FakeConfigSource( "foo.config" ) );
var field = typeof ( Logger ).GetField( "factory", BindingFlags.Static | BindingFlags.NonPublic );
field.SetValue( null, factory );
Logger.Write( "Test" );
更新 2:虽然该 hack 在测试平台中有效,但在 msiexec 的上下文中运行时,程序集加载器找不到配置文件中引用的程序集。fuslogvw表示AppBase是windows system32目录,这有点意思。我不明白为什么会找到自定义操作程序集的清单依赖项(位于自定义操作程序集旁边的 [TargetDir] 目录中),但在配置文件中调用的动态加载程序集却没有。看不到任何解决方法。