我有一个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
答案 0 :(得分:1)
这样做的原因是基于I converted the DLL into .il file我在网上阅读的ref
关键字;我通过从方法的参数中删除[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中并运行我的程序,然后它可以正常工作。我希望这对以后的人有帮助