0

我有一个 C++ 构建的 tlb,它使用SAFEARRAY; 我曾经tlb importer生成一个 DLL 并使用 C# 构建它,我尝试了不同的选项,例如为/sysarray方法/noclassmembers生成不同的签名:

public void GetList(ref Array HHNums, ref Array PersNums)

public void GetList(ref int[] HHNums, ref int[] PersNums)

在这两种情况下,我仍然收到一个错误,抱怨System.TypeLoadException数组定义了太多维度。如何解决此错误?

我的 CMD 输入是"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\tlbimp.exe" /sysarray /out:ADI /noclassmembers /namespace:A.namespace myDTI.tlb

4

1 回答 1

1

原因是ref基于我在网上阅读的关键字,我将 DLL 转换为 .il 文件[In]我通过从方法的参数中删除来修改代码:

instance void  GetListWithWeight([In][out] int32[]&  marshal( safearray int32) HHNums,
                                 [In][out] int32[]&  marshal( safearray int32) PerNums,
                                 [In][out] float32[]&  marshal( safearray float32) Wgts) runtime managed internalcall

它变成了:

instance void  GetListWithWeight([out] int32[]&  marshal( safearray int32) HHNums,
                                 [out] int32[]&  marshal( safearray int32) PerNums,
                                 [out] float32[]&  marshal( safearray float32) Wgts) runtime managed internalcall

然后我将 .il 打包成一个 DLL 并运行我的程序,然后它运行良好。我希望这对将来的人有所帮助

于 2018-07-25T10:43:56.060 回答