【问题标题】:NuGet package with a dependency on Visual C++ 2013 Runtime依赖于 Visual C++ 2013 Runtime 的 NuGet 包
【发布时间】:2016-02-20 03:07:09
【问题描述】:

我从 .NET4.0 DLL 创建了一个 NuGet 包,其中包含混合(托管和本机)代码。

Native 代码打包在 .NET4.0 DLL 中,但依赖于 Visual C++ 2013 Redistributable

我正在尝试集思广益,用 NuGet 包打包 redist 和/或警告用户他们需要它,但我画的是空白。

有人有什么想法吗?

【问题讨论】:

  • 很怀疑隐藏这个是个好主意。不仅仅是 CRT,这很容易解决,您还对客户端项目的平台目标设置有一个坚如磐石的依赖关系。如果您没有纯包装,则很难隐藏。基本建议in this post.
  • 我不一定想隐瞒,但我确实想至少告知。否则,我会让用户通过“Y U NO Work”类型的问题来获得技术支持

标签: c# c++ visual-c++ nuget nuget-package


【解决方案1】:

实际上我自己解决了这个问题。虽然我找不到将 VCpp 运行时包含为 NuGet 包的依赖项的解决方案,但我确实找到了一个解决方案来警告用户需要 Visual C++ 2013 运行时。

我在启动需要 VC++ 运行时的组件/库时静态地运行此代码一次:

    private static void AssertVcppDependencies()
    {
        var system32Path = Environment.GetFolderPath(Environment.SpecialFolder.SystemX86);
        var system64Path = Environment.GetFolderPath(Environment.SpecialFolder.System);

        string platform = Environment.Is64BitProcess ? "x64 and x86" : "x86";
        bool success = File.Exists(Path.Combine(system32Path, MSVCP120DllName));

        if (Environment.Is64BitProcess)
        {
            success &= File.Exists(Path.Combine(system64Path, MSVCP120DllName));
        }            

        if (!success)
        {
            throw new InvalidOperationException("This Application Requires the Visual C++ 2013 " + platform + 
                " Runtime to be installed on this computer. Please download and install it from https://www.microsoft.com/en-GB/download/details.aspx?id=40784");
        }
    }

这应该会提醒所有使用 NuGet 包的开发人员,他们需要安装运行时。

【讨论】:

  • 补充一句,可以通过测试bool is64bit = IntPtr.Size == 8查看当前应用的平台,只测试一个dll。
  • 我解决它的另一种方法。我的 C++ 库源代码包含在我们的原生 DLL 中。在这种情况下,我能够针对 VC++ 运行时进行静态编译,以避免在客户端 PC 上安装它。只有在 a.) 您的 C++ 库代码和 b.) 不与可能链接了不同版本的运行时的任何其他 C++ 库对话时才建议使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2010-11-17
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多