如何解决将数组从VBA传递到C#DLL使用DllExport公开
我以前已经创建了一个Excel / VBA使用的C ++ DLL。它工作正常,可用于分析和处理工作簿中的数据。
当前的需要是使用JSON将结果发送到Web API。可以直接在VBA中实现此功能,但是我更喜欢使用C#DLL。我有现有的代码来创建JSON消息并进行身份验证和发送。缺少的部分是VBA与C#之间的交互。
与以前的C ++ DLL一样,我想避免COM注册,并已使用RGiesecke.DllExport。交互立即开始使用整数和双精度,部分使用字符串。到目前为止,这是我的测试:
C#类中的函数:
[DllExport("extAddIntegers")]
public static int extAddIntegers(int FirstInteger,int SecondInteger)
{
return FirstInteger + SecondInteger;
}
[DllExport("extAddDoubles")]
public static double extAddDoubles(double FirstDouble,double SecondDouble)
{
return FirstDouble + SecondDouble;
}
[DllExport("extStringLengthAsInteger")]
public static int extStringLengthAsInteger(string MyString)
{
return MyString.Length;
}
[DllExport("extStringLengthAsText")]
public static string extStringLengthAsText(string MyString)
{
return "String length = " + MyString.Length;
}
[DllExport("extArrayTest")]
public static int extArrayTest(double[] DoubleArray)
{
return DoubleArray.Count();
}
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
前三个函数可以很好地工作,证明整数和双精度都可行,并且可以将字符串从VBA发送到C#。
第四项测试很奇怪。 C#函数似乎正常工作,VBA中的消息框显示了预期的返回字符串,即“字符串长度= 12”。但是,此后Excel崩溃,因此返回的字符串某种程度上是不兼容的。
真正的问题是传递数组,即使小测试功能也不起作用。调试时,DoubleArray参数在C#中仍然为Null,这会在DoubleArray.Count()行上引发异常。 Visual Studio显示异常但不会崩溃。另一方面,Excel却因为没有得到答案而崩溃而崩溃。
我正在尝试extArrayTest(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,ArrayC(0,ArrayD(0,0)
最终,我想将相同的双精度二维数组发送到C#DLL。在C ++声明中可见的数组维数是已知的并且是固定的。另外,我想发送一个二维的字符串数组,也包含已知的和固定的维数。
我已经看到了一些类似的问题,但是在这些互操作中是使用COM实现的,因此解决方案不太适用。
这是一个封送问题吗?我已经看到在相关问题中进行了讨论,甚至尝试了一些建议,但无济于事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。