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:
\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进程,因此这应该不是问题所在。