使用非托管dll从VBA到C#的唯一移植代码

使用非托管dll从VBA到C#的唯一移植代码,c#,vba,unmanaged,dllimport,porting,C#,Vba,Unmanaged,Dllimport,Porting,对于了解VBA和非托管C#的人来说,这将是一个巨大的挑战 首先,我们获得了一个第三方dll,几乎没有关于它的API使用的文档,但是我们确实获得了一个使用该dll的Excel电子表格。问题是,当我们尝试将代码移植到C时,情况变得越来越糟。我有一种奇怪的感觉,我们错过了一件小事 无论如何,电子表格中的代码如下所示 Declare Sub someFunction Lib "C:\somedll.dll" _ (types1 As TYPE1, _ vals1 As Double, vals2 As

对于了解VBA和非托管C#的人来说,这将是一个巨大的挑战

首先,我们获得了一个第三方dll,几乎没有关于它的API使用的文档,但是我们确实获得了一个使用该dll的Excel电子表格。问题是,当我们尝试将代码移植到C时,情况变得越来越糟。我有一种奇怪的感觉,我们错过了一件小事

无论如何,电子表格中的代码如下所示

Declare Sub someFunction Lib "C:\somedll.dll" _
(types1 As TYPE1, _
vals1 As Double, vals2 As Double, _
type2 As TYPE2, type3 As TYPE3, types4 As TYPE4, _
vals3 As Double)

... 'Logic to fill in the arrays and create UDT's etc.

Call someFunction(types1(0), vals1(0), vals2(0), _
type2, type3, types4(0), vals3(0))
选项Explicit被设置为所有数组都被标注尺寸或“Dim”,它们使用UDT来表示类型1、类型2等

现在的问题是,当我移植到C#时,我没有得到我在VBA中看到的预期结果

我的C代码如下

    [DllImport("c:\somedll.dll", CallingConvention = CallingConvention.ThisCall)]
    private static extern void someFunction( ref TYPE1[] types1,
                                               ref double[] vals1,
                                               ref double[] vals2,
                                               TYPE2 type2,
                                               TYPE3 type3,
                                               ref TYPE4[] types4,
                                               ref double[] vals3);

 ...

 //in a method after all arrays are initialized etc 

 someFunction(ref types1, ref vals1, ref vals2, type2, type3, ref types4, ref vals3);

 // PInvoke function 'someFunction' has an unbalanced stack. Signatures are off etc.
问题是代码几乎与VBA相同,减去数组不是动态的,以及C#中使用封送定义的结构。下面是一个结构的示例

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
 public class TYPE3
 {
    public double t1;
    public double t2;
    public double t3;
 }
我还注意到,在VBA版本中传递的所有数组都被操纵,即使您传递的是数组的索引(0)。这可能与它们在VBA中传递指向数组的指针有关吗

不管怎样,这真的让我困惑,因为最近我尝试了所有的方法,包括指针(IntPtr)等等


甚至尝试从C++调用DLL。但这提出了一系列全新的问题,我将在这里不再讨论

我认为你的原型不可能是正确的。如果是ThisCall,则第一个参数应该是对调用方法的对象的引用。。。因此,要么不是this调用,要么你的第一个参数不是数组。

我想知道你工作场所的自杀率是多少。。。