Vb.net 编组返回要在VBA中使用的Double()的.Net函数
以下是我在.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有数百个示例,但我发现的唯一一个示例显示了相反的情
<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
如果有人有一个指向这个例子的指针-一个双精度(或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