一种可能的解决方案是随您的应用程序一起提供 Lib 文件夹的副本。我相信 IronPython 许可证(Microsoft Public License (Ms-PL))和 Python 许可证(Python License)都允许这样做。
该计划的好处:
应用程序很容易找到 Lib 文件夹。
安装会更容易,因为需要处理的安装程序将减少。
安装程序的总大小会更小。
如果应用程序使用的 IronPython 程序集是在本地复制的,那么复制 Lib 也是有意义的,这样两者就不会像使用 Program Files 中的 Lib 时那样不同步。
许可证似乎没有施加任何繁重的义务。Ms-PL 确实要求您在发行版中包含 Ms-PL 的完整副本,但这没什么大不了的。
编辑:这是代码
以下是我所做的。
Lib 文件夹被复制到我的 .csproj 文件的 AfterBuild 目标中。我不知道如何使用内置的 MSBuild 复制命令,因为与 MSBuild 相关的一切都被设计为最大程度地痛苦,所以我改用了 robocopy。(robocopy 是 xcopy 的替代品;您可以使用 xcopy 代替)。
<Target Name="AfterBuild">
<Exec Command="robocopy $(ProjectDir)..\3rdParty\IronPython\IronPython2.0.2\Lib $(OutputPath)IronPython\Lib /E /XD .svn" IgnoreExitCode="true" />
<Exec Command="copy $(ProjectDir)..\3rdParty\IronPython\IronPython2.0.2\license.* $(OutputPath)IronPython\" />
</Target>
它复制许可证文件(根据许可证的要求)并且不包括颠覆文件夹 (.svn)。
“3rdParty”文件夹位于我的 Visual Studio 解决方案的根级别。这是我保存第三方库的地方。
我忽略了 robocopy 的退出代码,因为<Exec>
无法处理 robocopy 的退出代码。这并不理想,但我认为下一行中的普通副本会解决任何问题。
这就是我在代码中找到 Lib 路径的方式:
var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var libPath = Path.Combine(assemblyPath, @"IronPython\Lib");
要在单元测试中复制 Lib,请执行以下操作:
[TestMethod()]
[DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
public void MyTest()
{
// ...