【发布时间】:2017-09-04 15:51:35
【问题描述】:
问题: .NET Core 2.0(netstandard 2.0)有什么方法可以在运行可执行文件时应用给定application.exe.config 文件中未定义的程序集重定向?也许一些程序化的方式?或者甚至通过运行带有一些特殊设置/标志的可执行文件?
场景: 这是我试图在 .NET Core 2.0 中解决的简化方案。
- 有一个“服务托管”可执行文件,我们称之为
ServiceHost.exe - 有一个服务
.dll,我们称之为Service.dll,它实现了一些入口接口IService,方法是Start()。 - 当我运行
ServiceHost.exe --service-assembly Service.dll时,它会加载服务并调用其IService.Start()实现。 - 服务的作者可以是任何人,它独立于服务主机。
假设服务需要一些程序集重定向。当您引用比旧 .NET Framework 更多的包并且并非所有包都具有最新 .NET Core 的确切版本时,这在 .NET Core 世界中很常见。使用程序集重定向效果很好,并且允许您使用针对旧版本的库。
我的设置出现了问题。由于Service.dll 是由独立可执行文件加载的库,因此不使用带有程序集重定向的app.config 文件。运行时使用ServiceHost.exe.config 而不是Service.dll.config,这是预期的。
提醒:我正在使用 .NET Core,因此无法选择创建新应用程序域并将其设置为加载不同配置文件的解决方案。
【问题讨论】:
-
创建一个新的进程,然后让它加载一个不同的配置文件。无论是作为包装器,还是通过使用不同的参数重新调用自己,在您弄清楚是什么重定向程序集以加载需要之后。基本上,穷人的叉子。 (如果你想重定向标准输入/输出,那可能会很烦人。)
-
.NET Core 没有绑定重定向,也没有读取任何
.config文件,它只是有一些逻辑来扫描.deps.json文件描述的位置中的文件,这是可访问的通过Microsoft.Extensions.DependencyModelAPI。您总是可以手动加载程序集。 -
@JeroenMostert:如果进程仍然是相同的“servicehost.exe”,它仍然会加载相同的“servicehost.exe.config”。我唯一能做的就是在启动新实例之前更改该文件的内容,这似乎不是很好的方法。 @MartinUllrich:.NET Core 本身没有绑定重定向,这是真的。在我的例子中,.exe 本身是针对
net462的 .NET Core 项目,但所有实际逻辑都在netstandard2.0库中。所以程序集重定向和.config正在发挥作用。 -
从另一个角度回到这个问题:如果服务“需要一些程序集重定向”,那么它在设计时并没有考虑到 .NET Core。使用
PackageReference逻辑,正确的服务将附带使该服务运行所需的所有二进制文件,而不会出现依赖冲突。您的问题可能归结为“我如何使 .NET Core 的程序集绑定重定向成为可能”,而答案是“对于 .NET Core,您可能应该找到一种没有它们的生活方式”。 -
@JeroenMostert,你是对的。我的问题来自于我需要定位
net462但我希望代码与netstandard2.0完全兼容。由于需要在 .NET 4.6.2 中进行程序集重定向,这在我的情况下不起作用。我通过将大部分库保留在netstandard2.0上但具有实际可执行目标net462并使用应用程序域从配置文件加载程序集重定向来解决它。感谢您的想法。