从 vb 调用非托管 c++ dll 中的函数

Call function in unmanaged c++ dll from vb

我有一个非托管的 c++ dll(我创建的),它有一个带有一堆输入变量(标量和数组)和输出数组的函数。 我想从 visual basic 程序中调用它。我有一个简单的表单 + 一个按钮,单击时调用 dll 中的函数。 在 vb 文件中导入如下:

Module MyDLLModule
  <DllImport("mydll.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi)> Public Function fun(ByVal var1 As Double, _
                                                                  ByVal var2 As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr1() As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr2() As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr3() As Double, _
                                                                  ByVal var3 As Double, _
                                                                  ByVal var4 As Double, _
                                                                  ByVal var5 As Double, _
                                                                  ByVal var6 As Double, _
                                                                  ByVal var7 As Double, _
                                                                  ByVal var8 As Double, _
                                                                  ByVal var9 As Double, _
                                                                  ByVal var10 As Double, _
                                                                  ByVal var11 As Integer, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr4() As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arrout() As Double) As Integer

  End Function
End Module

它以后就像任何其他函数一样被使用。

无论是在 MSVS 中调试还是仅 运行 应用程序,这在我开发的机器上都运行良好。但是当我将所有文件移动到另一台计算机时,它会在单击按钮调用 dll 时抱怨:

"Unable to loadl DLL "mydll.dll": The specified module could not be found. (Exception form HRESULT: 0x8007007E).

我一直在阅读和测试一些不同的可能性:

  1. 将 dll 添加到与 exe 文件相同的路径
  2. 使用系统路径:C:\MyDLLs,并将dll放在这里。
  3. 将 dll 作为现有项添加到 vb 项目并将属性设置为内容并始终复制。

None 这些作品。有没有人有解决这个问题的想法?

建议:

在您的 .dll 上尝试 运行ning depends.exe 或 dumpbin.exe 以查看它可能有哪些依赖项。

  1. 你是对的:PATH 是你需要看的第一件事。如果所有其他方法均失败,则将您的 .dll 复制到 \windows\system32(至少用于调试目的)。

  2. 否则,您的 .dll 可能依赖于 "something else"。比如具体的MSVC 运行时间。 "depends" (GUI) 或 "dumpbin" (cmd-line)_ 应该告诉你。

  3. 我假设你的 .dll 是 NOT 一个 COM/ActiveX .dll,问题是你还没有注册它。坦率地说,这也值得仔细检查。

PS:

  1. 您可以从 "MSVS Developer Command Prompt".

  2. 运行 dumpbin
  3. 您可以键入 dumpbin /? 来查看选项。你想要 dumpbin /dependents mydll.dll.

  4. 如果需要MSVC运行时间,可以在这里下载:

https://www.microsoft.com/en-us/download/details.aspx?id=48145

感谢 paulsm4:msvc 运行时似乎是问题所在。编译时使用 /MT 标志(据我所知是静态链接)mydll.dll 解决了它。