C# API数组返回类型

C# API数组返回类型,c#,arrays,api,C#,Arrays,Api,我正在开发一个现有的API,它是由一些不再在我公司工作的开发人员编写的。据我所知,API是作为dll实现的,它通过套接字与本地主机上的服务器程序进行通信。因此,它来回封送对象。我必须向这个API添加一些方法。有许多现有方法返回可用名称(所有字符串)的列表。但是,它们都作为对象数组返回。代码如下: [return: MarshalAs( UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT )] object[] GetAva

我正在开发一个现有的API,它是由一些不再在我公司工作的开发人员编写的。据我所知,API是作为dll实现的,它通过套接字与本地主机上的服务器程序进行通信。因此,它来回封送对象。我必须向这个API添加一些方法。有许多现有方法返回可用名称(所有字符串)的列表。但是,它们都作为对象数组返回。代码如下:

[return: MarshalAs( UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT )]
object[] GetAvailableNames( );

我不太清楚为什么要这样做:为什么不直接返回一个字符串数组呢?有人知道吗?

这有点推测,但本机API实际上返回的是一个安全的变量对象数组,而不是字符串数组。我认为,封送安全变体数组的正确方法确实是将其作为字符串数组。即使它只包含字符串,但将任何类型放入变体插槽都是合法的


也就是说,如果您可以访问代码的两端(托管和本机),最好将它们切换为直接与字符串数组通信。

内存是如何处理的?@leppie根据注释判断,它是一个安全的数组,因此CLR可以通过COM规则处理内存。@JaredPar:好的,我根本不知道COM。因此,假设COM进程/服务器将处理内存?@leppie,COM的一个优势(如果操作正确)是API的内存职责仅从其签名就可以很好地理解。在这种情况下,很明显,分配了数组的用户和被调用方负责释放它。@JaredPar:谢谢你,感谢上帝,我从来没有使用过COM:)作为一个推论(也许是我主要关心的问题):如果我确定要返回字符串数组(而不是任何其他类型),你有什么理由认为我不应该只使用
string[]
?@Smashery,是的。如果它实际上是引擎盖下的一个安全的变体阵列,那么您必须将其作为一个安全阵列进行封送。否则将导致内存泄漏和/或编组错误。这可能只是碰巧与字符串工作,但你会走一条非常危险和罚款线。最好保持原样,或者同时改变本地和管理的助手;但是我必须问:什么是安全的变量数组,为什么.NET
string[]
可能是一个?@Smashery安全的变量数组是.NET中COM版本的
object[]
。它是一个定义长度、理解内存语义的数组,可以容纳任何COM对象类型(特别是任何
变量
类型)。它提供了一种通过COM API传递任意对象的定义方式。@Smashery而且安全数组不一定是一个
string[]
。相反,它是CLR封送处理的安全数组,并对数组中的每个元素一次执行一个转换。它们恰好都是
string
,所以在本例中就可以解决这个问题。