在C#中初始化SAFEARRAY ref(来自VB的端口?)

时间:2011-11-21 16:41:01

标签: c# vb.net com ref safearray

我正在使用第三方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。

1 个答案:

答案 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声明是什么样的吗?

相关问题