如上所述,我正在将应用程序从 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...或其依赖项之一。找不到指定的模块。”
您是否已将项目强制为 x86?
你不能使用“任何CPU”,因为vs2022是VS的第一个x64位版本。
因此,当您构建并运行时,使用任何 CPU 时您都会有一个 x64 位项目。以前版本的 VS 意味着任何 CPU 都会默认运行 x32 位,因为 vs2022 之前的任何版本的 VS 都是 x32 位版本。
现在 vs2022 是 x64 位,那么默认的 ANY cpu 会导致您的项目以 x64 位运行,因此,它们无法消耗 x32 位 dll。
因此,从此处选择(强制)项目以 x32 位运行:
除此之外,我还得说,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。
因此这个选项: