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

时间:2015-11-09 07:17:16

标签: c++ vb.net dll unmanaged

我有一个非托管的c ++ dll(我的创建),它有一个带有一堆输入变量(标量和数组)和输出数组的函数。 我想从一个视觉基础程序中调用它。我有一个简单的表单+一个按钮,在单击时调用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时抱怨:

  

“无法加载DLL”mydll.dll“:指定的模块不能   找到。 (HRESULT的异常形式:0x8007007E)。

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

  1. 将dll添加到与exe文件相同的路径
  2. 使用系统路径:C:\ MyDLLs,并将dll放在此处。
  3. 将dll作为现有项添加到vb项目中,并将属性设置为内容并始终复制。
  4. 这些都不起作用。有没有人有想法解决这个问题?

2 个答案:

答案 0 :(得分:1)

建议:

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

  1. 你是正确的:PATH是你需要关注的第一件事。如果所有其他方法都失败,请将.dll复制到\​​ windows \ system32(至少用于调试目的)。

  2. 否则,您的.dll可能依赖于&#34;其他内容&#34;。例如特定的MSVC运行时。 &#34;取决于&#34; (GUI)或&#34; dumpbin&#34; (cmd-line)_应该告诉你。

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

  4. PS:

    1. 您可以从&#34; MSVS Developer命令提示符&#34;运行dumpbin。

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

    3. 如果事实证明您需要MSVC运行时,可以在此处下载:

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

答案 1 :(得分:1)

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