如何在VBA中使用来自C#的非托管导出?

如何在VBA中使用来自C#的非托管导出?,c#,vba,C#,Vba,我正在尝试使用非托管导出包()从C#dll导出函数。我不想使用COM 不幸的是,我遇到了一个错误: 找不到DLL入口点_TestDLL@4在DllName中 我的C#类看起来像这样: public class TestClass { [DllExport] public static int TestDLL(int x) { return x + 2; } } Private Declare Function TestDLL Lib "DllNa

我正在尝试使用非托管导出包()从C#dll导出函数。我不想使用COM

不幸的是,我遇到了一个错误:

找不到DLL入口点_TestDLL@4在DllName中

我的C#类看起来像这样:

public class TestClass
{
    [DllExport]
    public static int TestDLL(int x)
    {
        return x + 2;
    }
}
Private Declare Function TestDLL Lib "DllName" Alias "_TestDLL@4" (ByVal x As Long) As Long

Public Sub TestFunc()
    MsgBox CStr(TestDLL(2))
End Sub
我这样称呼它:

public class TestClass
{
    [DllExport]
    public static int TestDLL(int x)
    {
        return x + 2;
    }
}
Private Declare Function TestDLL Lib "DllName" Alias "_TestDLL@4" (ByVal x As Long) As Long

Public Sub TestFunc()
    MsgBox CStr(TestDLL(2))
End Sub

为什么它不能工作…?

多亏了Hans Passant的评论,我尝试在我的dll上使用dumpbin.exe/exports,它给出了一个输出:

文件DllName.dll的转储

00000000 characteristics
5315D2DA time date stamp Tue Mar 04 14:19:22 2014
    0.00 version
       1 ordinal base
       1 number of functions
       1 number of names

ordinal hint RVA      name

      1    0 000027DE TestDLL
文件类型:DLL

节包含\DllName.dll的以下导出

00000000 characteristics
5315D2DA time date stamp Tue Mar 04 14:19:22 2014
    0.00 version
       1 ordinal base
       1 number of functions
       1 number of names

ordinal hint RVA      name

      1    0 000027DE TestDLL
总结

    2000 .reloc
    2000 .rsrc
    2000 .sdata
    2000 .text
如您所见,函数名为TestDLL。我将VBA中的声明更正为:

Private Declare Function TestDLL Lib "DllName" (ByVal x As Long) As Long

现在它可以正常工作了:)

听起来你只是没有正确使用该工具,比如没有使用项目模板。别名不是必需的,最好将其删除。通过在DLL上运行dumpbin.exe/exports进行双重检查。