从 Windows 10 下的 VS2019 迁移到 Windows VB 下的 VS2022 时,Dll 无法加载问题

问题描述 投票:0回答:1

如上所述,我正在将应用程序从 Win10、VS2019 迁移到 Win11 VS2022。 在 Win11/2022 环境中,我收到“无法加载 dll...或其依赖项之一。找不到指定的模块。”请注意,父应用程序是 32 位 (X86) vb 应用程序。 DLL 是 c++ (vs2013)。

DLL 是完全合格的。 我对 dll 运行了 dumpbin,6 个依赖项都在 syswow64 中,DLL 也是如此。

这是声明和有问题的函数调用,

<DllImport("C:\windows\syswow64\MyFile.dll", CallingConvention:=CallingConvention.Cdecl)>

Public Shared Function MyFile_open_device(ByVal index As Integer, ByRef errorCode As IntPtr) As Integer

End Function

在主线代码中,MyFile_open_device 嵌套在 Try 块中,该块又抛出 Try 块的文本解释。

除了您可能有的问题或有关如何诊断的建议(两者都受欢迎)之外,我想知道是否有人知道 10/11 或 2019/2022 之间会导致这种情况的任何变化。

这是声明和有问题的函数调用,

<DllImport("C:\windows\syswow64\MyFile.dll", CallingConvention:=CallingConvention.Cdecl)>

Public Shared Function MyFile_open_device(ByVal index As Integer, ByRef errorCode As IntPtr) As Integer

End Function

我收到“无法加载 dll...或其依赖项之一。找不到指定的模块。”

vb.net version dllimport migrating
1个回答
0
投票

您是否已将项目强制为 x86?

你不能使用“任何CPU”,因为vs2022是VS的第一个x64位版本。

因此,当您构建并运行时,使用任何 CPU 时您都会有一个 x64 位项目。以前版本的 VS 意味着任何 CPU 都会默认运行 x32 位,因为 vs2022 之前的任何版本的 VS 都是 x32 位版本。

现在 vs2022 是 x64 位,那么默认的 ANY cpu 会导致您的项目以 x64 位运行,因此,它们无法消耗 x32 位 dll。

因此,从此处选择(强制)项目以 x32 位运行:

enter image description here

除此之外,我还得说,c:\windows 中的.dll 已经被锁定多年,因此此类.dll 常常会被锁定,甚至被病毒扫描软件拦截。要将此类文件复制到系统文件夹,您将需要提升权限(因此,该位置对于您的自定义 .dll 来说确实不太理想)。

即使是 vs2022 之前的项目也应该强制 CPU 设置,因为除非您的代码和依赖项可以作为 x64 或 x32 位运行(所有 .net 代码 .dll),否则将其留给机会并使用任何 CPU 意味着您几乎不知道关于您的应用程序将以什么位大小运行。

在您的情况下,由于这些是 x32 位 dll,那么您需要强制您的项目以 x86 运行,并且默认的 ANY CPU 现在会生成 x64 位程序,而不是 x32 位程序(这是使用版本时的默认结果) vs2022 之前的 VS。

我会移动这些 .dll,并右键单击它们,并确保它们未被阻止,因为如果它们是从互联网下载的,.net 不会消耗此类 .dll。事实上,即使下载包含一些示例代码和 .dll 的 zip 文件?当您解压缩时,文件将被阻止,无法被 .net 使用。

因此,您需要确保在解压之前取消阻止 zip 文件,因为该 zip 内部的任何 .dll 也将被标记为被阻止且不安全。

因此,在解压缩之前请先解锁 zip 文件。或者,解压缩后,取消阻止该解压缩文件夹中的所有文件和 .dll。

因此这个选项:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.