0

我按照下一页上的教程创建了一个 c++ DLL,并将其放在 System32 文件夹中:http: //msdn.microsoft.com/en-us/library/ms235636%28v=vs.80%29。 .aspx _ 我可以在 PC 上的任何地方运行 .exe。现在我希望能够从 VB.NET 应用程序中调用 Add,所以我添加了以下代码:

Imports System.Runtime.InteropServices

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            Dim Test As Integer
            Test = Add(1, 1)
            MsgBox(Test)
        Catch ex As Exception

        End Try
    End Sub

    <DllImport("MathFuncsDll.dll", EntryPoint:="Add", SetLastError:=True, CharSet:=CharSet.Ansi)> _
    Private Shared Function Add(ByVal a As Double, ByVal B As Double) As Double
    End Function

End Class

我收到以下错误:无法在 DLL 'MathFuncsDll.dll 中找到名为 'Add' 的入口点。我相信这是因为命名空间。我对此进行了研究,一些网页说平台调用不允许命名空间,一些网页说它们是允许的。问题是什么?

4

2 回答 2

3

入口点未命名为“添加”。从 Visual Studio 命令提示符运行dumpbin /exports MathFuncsDll.dll以查看导出的名称。要获得此声明:

<DllImport("MathFuncsDll.dll", EntryPoint:="?Add@MyMathFuncs@MathFuncs@@SANNN@Z", _
           CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function Add(ByVal a As Double, ByVal B As Double) As Double
End Function

这个看起来很奇怪的名字是由 C++ 编译器产生的,这个特性叫做“名字修饰”。它支持函数重载。你可以把它放在extern "C"函数声明的前面来禁止它。如果你不这样做,实际上会更好。还要注意 SetLastError 不正确,代码实际上并没有调用 SetLastError() 来报告错误。而且 CharSet 不合适,这些函数不接受字符串。

您还需要对 Divide 函数做一些事情,在互操作场景中抛出 C++ 异常不会有好的结果,只有 C++ 代码可以捕获异常。

于 2012-10-14T18:13:54.310 回答
0

不允许命名空间。PInvoke 像普通的 C 客户端一样工作。不要忘记将 MathFuncsDll 声明为 extern "C" 以防止 C++ 名称混淆。使用 Dependency Walker 或 dumpbin 查看从 MathFuncsDll 导出的函数列表。

于 2012-10-14T17:43:01.663 回答