依赖于Visual C++ 2013 Runtime的NuGet包

11

我已经从包含混合代码(托管和本机代码)的.NET4.0 DLL创建了一个NuGet软件包。

本机代码被打包在.NET4.0 DLL中,但是需要Visual C++ 2013 Redistributable的依赖项。

我正在尝试构思一些方法来将redist与NuGet软件包一起打包或者警告用户他们需要它,但我却不知道如何做。

有人有什么想法吗?


相当怀疑隐藏这个东西是一个好主意。这不仅仅是CRT,这很容易解决,您还有一个严重依赖于客户项目的平台目标设置。如果没有纯包装器,很难隐藏。在此帖子中给出了基本建议。 - Hans Passant
我并不一定想要隐藏,但我至少想要告知。否则,我会遇到用户提出“为什么你不工作”类型的技术支持问题。 - Dr. Andrew Burnett-Thompson
1个回答

2

我其实自己解决了这个问题。虽然我找不到一种将VCpp Runtime作为NuGet包的依赖项的解决方案,但我找到了一种解决方案,可以提醒用户需要Visual C++ 2013 Runtime。

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

    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包的开发人员需要安装运行时。


1
只是补充一下,您可以通过测试 bool is64bit = IntPtr.Size == 8 来检查当前应用程序的平台,并且只测试一个 dll。 - Patrick Stalph
我解决它的另一种方式是使用一个C++库源代码,该库被包含在我们的本地DLL中。在这种情况下,我能够静态编译VC++运行时,避免在客户端PC上安装此运行时所需的需要。只有在以下两种情况下才建议使用:a.) 您的C++库代码和b.) 不与可能链接不同版本运行时的任何其他C++库通信。 - Dr. Andrew Burnett-Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接