Can';t使用VBA中的字符串调用VB.NET COM DLL函数

Can';t使用VBA中的字符串调用VB.NET COM DLL函数,vb.net,excel,vba,dll,unmanaged,Vb.net,Excel,Vba,Dll,Unmanaged,我用一个简单的测试函数实现了一个VB.NET DLL: <ComVisible(True)> Function TestString ( <MarshalAs(UnmanagedType.BStr)> xyz As String) As <MarshalAs(UnmanagedType.BStr)> String Dim y As Integer TestString = "Hello" End Function 显然,我也从VBA加载DLL但是

我用一个简单的测试函数实现了一个VB.NET DLL:

<ComVisible(True)>  
Function TestString ( <MarshalAs(UnmanagedType.BStr)> xyz As String) As <MarshalAs(UnmanagedType.BStr)> String
Dim y As Integer
    TestString = "Hello"
End Function
显然,我也从VBA加载DLL但是问题是,当我像这样运行函数时:

Dim st as String
st = "Hello"
Debug.Print TestString(ByVal st)
我收到一条消息,说DLL调用约定不正确。另一方面,当我删除
时,该函数工作正常,但在打印
“Hello”
后不久崩溃


我做错了什么?

公共声明函数
是用于调用从DLL导出的函数的语法,这是与COM不同的机制

要使用COM添加对DLL的引用,请创建一个包含
TestString
的类实例,然后在该实例上调用:
r=classInstance.TestString(“Hello”)

公共声明函数
是用于调用从DLL导出的函数的语法,这是与COM不同的机制

要使用COM添加对DLL的引用,请创建一个包含
TestString
的类实例,然后在该实例上调用:
r=classInstance.TestString(“Hello”)

您应该在VB.NET中使用Return返回函数值。这没有什么意义,它的用法不明显。“我显然也加载了DLL”使情况变得更糟。如果你使用某种IL重写器工具,比如Giesecke的非托管导出,那么你需要记录它。没错。是的,我使用Gieseckes重写器。我在运行时使用LoadDlly加载DLL您应该在VB.NET中使用Return返回函数值这没有什么意义,它的用法不明显。“我显然也加载了DLL”使情况变得更糟。如果你使用某种IL重写器工具,比如Giesecke的非托管导出,那么你需要记录它。没错。是的,我使用Gieseckes重写器。我在运行时使用LoadDLLI加载DLL,我不这么认为。这种方法适用于其他类型的数据类型-Long、Integers等。例如,如果我用Long替换字符串,该函数将很好地工作。由于某些原因,只有字符串正在破坏我的代码,我不这么认为。这种方法适用于其他类型的数据类型-Long、Integers等。例如,如果我用Long替换字符串,该函数将很好地工作。由于某种原因,只有字符串正在破坏我的代码
Dim st as String
st = "Hello"
Debug.Print TestString(ByVal st)