使用非托管dll从VBA到C#的唯一移植代码
对于了解VBA和非托管C#的人来说,这将是一个巨大的挑战 首先,我们获得了一个第三方dll,几乎没有关于它的API使用的文档,但是我们确实获得了一个使用该dll的Excel电子表格。问题是,当我们尝试将代码移植到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
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调用,要么你的第一个参数不是数组。我想知道你工作场所的自杀率是多少。。。