我正在使用第三方COM组件(即没有其代码)。有问题的方法有以下概要:
HRESULT GetTableInfo(
[in] BSTR bstrTableName,
[in,out] SAFEARRAY(BSTR) bstrColumnTitles,
[in,out] SAFEARRAY(long) lColumnPos );
我试图将ref传递给固定大小的数组((Array)string [6])和List.ToArray(),但它一直在崩溃我。 E.g。
Array arr1 = (Array) new string[500];
Array arr2 = (Array) new int[500];
table.GetTableInfo(filename, ref arr1, ref arr2);
更具体一点:我已经尝试了任何大小的值(正确的值应该是44)。对于List<>的容量尝试相同,但这也没有帮助。我也尝试了不同的类型,但除了int之外它不接受任何其他类型。
我不知道为什么它继续崩溃我的COM组件的一般错误(基本上表明出现了问题,但没有说明究竟是什么),因为我可以确认以下VB代码有效:
Dim TitleList() As String
Dim PositionList() As Long
Call objTable.GetTableInfo(txTableFile.Text, TitleList, PositionList)
有没有人知道为什么会这样?或者,任何人都可以向我提供一个VB代码到C#的端口吗?我曾尝试谷歌的教程,但他们所说的“只允许固定大小的数组”。我想知道那个代码是如何工作的,因为没有指定大小。
Thx i.a。
答案 0 :(得分:1)
您是否阅读过Default Marshaling for Arrays?只要你在PInvoke声明中使用MarshalAs
属性来指示数组应该被编组为安全数组,我可以告诉它应该“正常工作”。
据我所知,正确的PInvoke声明应该是一致的
public static string extern GetTableInfo(
string tableName,
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_BSTR)]
ref string[] columnTitles,
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_I8)]
ref long[] columnPos
);
您能告诉我们您的PInvoke声明是什么样的吗?