Vb.net 编组返回要在VBA中使用的Double()的.Net函数

Vb.net 编组返回要在VBA中使用的Double()的.Net函数,vb.net,marshalling,com-interop,Vb.net,Marshalling,Com Interop,以下是我在.Net中的函数: <Runtime.InteropServices.ComVisibleAttribute(True)> Public Function Unhex(hex As String) As Double() Dim GetArr As Double() = HexStringToDoubleArray(hex) Return GetArr End Function 关于如何将数组传递到.Net有数百个示例,但我发现的唯一一个示例显示了相反的情

以下是我在.Net中的函数:

<Runtime.InteropServices.ComVisibleAttribute(True)>
Public Function Unhex(hex As String) As Double()
    Dim GetArr As Double() = HexStringToDoubleArray(hex)
    Return GetArr
End Function
关于如何将数组传递到.Net有数百个示例,但我发现的唯一一个示例显示了相反的情况,它没有显示它正在VBA(甚至COM)端使用。也许我用错了搜索词。无论如何:

  • 我是否可以使用
    marshallas
    从.Net导出
    Double()
    ,或者我是否需要使用
    Marshal.Copy
    或类似工具(如我所怀疑的,因为它是被管理的)
  • 如果我必须
    复制
    ,那么返回类型是否正确
    IntPtr
  • 我认为Dim ret()作为Double是指向malloc'ed数组或SAFEARRAY的指针,对吗?在这种情况下,这是VBA中使用的正确类型吗
  • 在VBA中创建大小合适的数组(总是492!),然后将其传递给函数会有帮助吗?也许是交易

  • 如果有人有一个指向这个例子的指针-一个双精度(或int)数组连同相应的VBA代码一起从.Net中传递出去,我很可能从那里得到它。但是如果有人对上述问题有答案,VB.Net或C#如他们所愿,我将不胜感激。

    您需要用属性来装饰退货

    VB.Net示例:

    Imports System.Runtime.InteropServices
    
    <ComClass(ArrayExample.ClassId, ArrayExample.InterfaceId)> _
    Public Class ArrayExample
        ' These  GUIDs provide the COM identity for this class  and its COM interfaces.
        Public Const ClassId As String = "e510d899-dad1-412b-94ea-6c726fe9f9da"
        Public Const InterfaceId As String = "ef3498f0-22b4-4c2a-aeb1-22936c9757eb"
    
        Public Function Unhex(hex As String) As <MarshalAs(UnmanagedType.SafeArray)> Double()
            Dim GetArr As Double() = {2.0R, 5.0R}
            Return GetArr
        End Function
    End Class
    
    Edit:忘了提到它使用来让编译器为类生成接口


    编辑2以回答后续问题

    要调试COM库项目,请转到“项目属性”的“调试”选项卡。选择“启动外部程序”并将其设置为运行Excel。您还可以在“命令行参数”中指定要打开的工作簿。现在,当您单击“开始”按钮时,Excel将启动,代码中的断点将被触发


    编辑3:

    要解决针对.Net 3.5的问题,可以使用一种稍微不太方便的方法将调试器附加到Excel进程。如果您使用的是VS2008,上述方法将起作用。新的VS版本需要附加到流程。可能有一种方法可以在vproj.user文件中指定此信息,但我还没有找到允许使用特定框架版本直接启动的magic属性类型

    根据您的VS版本,“附加到流程”项将位于工具(VS2013)或调试(VS2017)菜单下,或者您可以使用快捷方式cntrl-alt-p

    显然,启动Excel并加载工作簿。然后在VS中启动“附加到进程”对话框。单击“选择”按钮,然后单击“调试这些类型”单选按钮。选择“托管(v3.5、v3.0、v2.0)代码”类型并单击“确定”按钮。然后选择Excel流程并单击“附加”


    尝试将Dim ret()作为变体使用。文档不会太关注那些没有做任何特殊工作的工作。请更新问题以解释问题所在。谢谢!出于好奇,我可以将VS调试器附加到VBA代码中,以便在代码变得更复杂时对其进行调试吗?是的,我现在正在尝试这样做,它没有找到PDB,我正在尝试找出它在哪里寻找它们。更新:我应该提到有一个PDB,它与DLL和测试excel位于同一目录中file@MauryMarkowitz,是否有Excel引用的dll/tlb不在项目的调试文件夹中?如果是这样的话,我建议您在开发过程中改变这一点。您必须在VBA编辑器中取消对项目的引用,将项目保存为包含引用的“关闭Excel”,然后重新连接。符号没有问题,除VBA和Excel14之外没有其他引用。更奇怪的是:MsgBox(hex)Dim GetArr As Double()={2.0R,5.0R}MsgBox(GetArr)返回GetArrAhhh,只是一个VS问题-将框架更改为4.5.1,并返回和presto,这是我的符号!
    Imports System.Runtime.InteropServices
    
    <ComClass(ArrayExample.ClassId, ArrayExample.InterfaceId)> _
    Public Class ArrayExample
        ' These  GUIDs provide the COM identity for this class  and its COM interfaces.
        Public Const ClassId As String = "e510d899-dad1-412b-94ea-6c726fe9f9da"
        Public Const InterfaceId As String = "ef3498f0-22b4-4c2a-aeb1-22936c9757eb"
    
        Public Function Unhex(hex As String) As <MarshalAs(UnmanagedType.SafeArray)> Double()
            Dim GetArr As Double() = {2.0R, 5.0R}
            Return GetArr
        End Function
    End Class
    
    Sub t()
       Dim c As ExampleComArrayReturn.ArrayExample
       Set c = New ExampleComArrayReturn.ArrayExample
       Dim arr() As Double
       arr = c.Unhex("AABB")
    End Sub