将数组从VBA传递到C#DLL(使用DllExport公开) 我以前创建了一个Excel/VBA使用的C++ DLL。它工作正常,用于分析和操作工作簿中的数据

将数组从VBA传递到C#DLL(使用DllExport公开) 我以前创建了一个Excel/VBA使用的C++ DLL。它工作正常,用于分析和操作工作簿中的数据,c#,arrays,vba,parameter-passing,C#,Arrays,Vba,Parameter Passing,当前需要使用JSON将结果发送到web API。这个功能可以直接在VBA中实现,但我更喜欢使用C#DLL。我有现有的代码来创建JSON消息,并对其进行身份验证和发送。缺少的部分是VBA和C#之间的交互 与前面的C++ DLL一样,我希望避免COM注册,并使用RGIESECK.DLLUTRAW。交互立即开始使用整数和双精度,部分使用字符串。以下是我目前的测试: C类中的函数: VBA声明 Public Declare PtrSafe Function extAddIntegers Lib &quo

当前需要使用JSON将结果发送到web API。这个功能可以直接在VBA中实现,但我更喜欢使用C#DLL。我有现有的代码来创建JSON消息,并对其进行身份验证和发送。缺少的部分是VBA和C#之间的交互

与前面的C++ DLL一样,我希望避免COM注册,并使用RGIESECK.DLLUTRAW。交互立即开始使用整数和双精度,部分使用字符串。以下是我目前的测试:

C类中的函数:

VBA声明

Public Declare PtrSafe Function extAddIntegers Lib "ServiceIntegration.dll" (ByVal FirstInteger As Long, ByVal SecondInteger As Long) As Long
Public Declare PtrSafe Function extAddDoubles Lib "ServiceIntegration.dll" (ByVal FirstDouble As Double, ByVal SecondDouble As Double) As Double
Public Declare PtrSafe Function extStringLengthAsInteger Lib "ServiceIntegration.dll" (ByVal MyString As String) As Long
Public Declare PtrSafe Function extStringLengthAsText Lib "ServiceIntegration.dll" (ByVal MyString As String) As String
Public Declare PtrSafe Function extArrayTest Lib "ServiceIntegration.dll" (ByRef DoubleArray As Double) As Long
来自VBA的测试调用:

MsgBox extAddIntegers(10, 20), vbOKOnly
MsgBox extAddDoubles(10.3, 20.6), vbOKOnly
MsgBox extStringLengthAsInteger("Test_ÖÄÅ_öäå"), vbOKOnly
MsgBox extStringLengthAsText("Test_ÖÄÅ_öäå"), vbOKOnly

Dim MyDoubleArray(5) As Double
MyDoubleArray(1) = 2.3
MsgBox extArrayTest(MyDoubleArray(0)), vbOKOnly
前三个1可以很好地工作,这证明了整数和双精度可以双向工作,字符串可以从VBA发送到C#

第四个测试很奇怪。C#函数似乎起作用,VBA中的消息框显示预期的返回字符串,即“字符串长度=12”。但是,Excel在此之后崩溃,因此返回的字符串在某种程度上不兼容

真正的问题是传递数组,即使很小的测试函数也不起作用。调试时,DoubleArray参数在C#中保持为Null,这会导致DoubleArray.Count()行出现异常。VisualStudio显示异常,但不会崩溃。另一方面,Excel因得不到答案而心烦意乱并崩溃

我正在尝试ExtraryTest(MyDoubleArray(0))表示法,因为它适用于VBA->C++:

C++ definition
void extDataManipulation(double ArrayA[48][3], double ArrayB[43][3], double ArrayC[41][3], double ArrayD[23][3]);

VBA call:
extDataManipulation ArrayA(0, 0), ArrayB(0, 0), ArrayC(0, 0), ArrayD(0, 0)
最后,我想将相同的二维双精度数组发送到C#DLL。在C++声明中可见的数组维度是已知的和固定的。另外,我想发送一个二维字符串数组,也包括已知的和固定的维度

我见过一些类似的问题,但在这些问题中,互操作是使用COM实现的,因此解决方案不太适用


这可能是封送问题吗?我已经在相关问题中看到了这一点,甚至尝试了一些建议,但都没有效果。

是的,返回的字符串不是BSTR,因此Excel在尝试释放字符串存储时会死掉。数组需要作为安全数组封送。这是最糟糕的方法,C代码喜欢抛出异常,当你接到支持电话时,你会不知道为什么。不使用COM是一个错误。
C++ definition
void extDataManipulation(double ArrayA[48][3], double ArrayB[43][3], double ArrayC[41][3], double ArrayD[23][3]);

VBA call:
extDataManipulation ArrayA(0, 0), ArrayB(0, 0), ArrayC(0, 0), ArrayD(0, 0)