将数组从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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...