C# 部署为x86和x64的文件时未找到Dll vcruntime140.Dll

C# 部署为x86和x64的文件时未找到Dll vcruntime140.Dll,c#,dll,native,vcredist,C#,Dll,Native,Vcredist,目前我收到错误消息,在客户端计算机上找不到vcruntime140.dll。但我正在为x64和x86提供以下DLL: vcruntime140.dll vccorlib140.dll msvcp140.dll concrt140.dll 在\bin32\和\bin64\目录中(针对每个平台)。此目录在应用程序启动时注册: Dll导入 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static ex

目前我收到错误消息,在客户端计算机上找不到
vcruntime140.dll
。但我正在为
x64
x86
提供以下DLL:

  • vcruntime140.dll
  • vccorlib140.dll
  • msvcp140.dll
  • concrt140.dll
  • \bin32\
    \bin64\
    目录中(针对每个平台)。此目录在应用程序启动时注册:

    Dll导入

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool SetDllDirectory(string lpPathName);
    
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool AddDllDirectory(string lpPathName);
    
    对于
    x86
    注册码:

    if (System.Environment.OSVersion.Version.Major > 5)
    {
        AddDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin32");
    }
    else
    {
        SetDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin32");
    }
    
    我还需要做什么


    谢谢大家!

    adddldirectory
    setdldirectory
    仅影响对
    LoadLibrary
    的后续调用。您的应用程序何时“启动”?例如,如果您有一个通过静态构造函数直接或间接引用代码的类,那么该代码可能会在执行任何操作之前执行。(另外,您实际上没有检查调用是否成功。您应该这样做。)这是我在program.csOh中做的第一件事,更严重的是--
    adddldirectory
    返回一个
    DLL\u目录\u COOKIE
    ,而不是
    bool
    (您可以将其封送为
    IntPtr
    )。这些功能不仅仅是可互换的。(正如我所说,检查它们的返回值并抛出新的Win32Exception(),如果它们返回
    false
    /
    IntPtr.Zero
    ,目前它们可以无声地失败。)太多的.NET程序员被解决方案平台和平台目标之间的差异弄糊涂了。添加
    if(IntPtr.Size!=4)抛出新异常(“实际上不是32位进程”)在本例中,它只是一个x86进程,因此这应该不是问题所在。