接受字节数组,vb6到C#interop

我正在做一个使用加密包装器来管理vb6的应用程序。 到目前为止,.net和interop部分是正常的,完全正常工作。
正如我的客户正在测试它,我只是有一个简单的问题:

[ComVisible(true)] public SomeObjectComVisible GetThat(byte[] array){ ... } 

到目前为止,我使用了暴露给com或int和string的类型,直到现在都没有问题。

是否可以使用(.net) byte或chould我使用*char
当我将程序集标记为可见并注册到com interop时,它会为它创建一个包装器,或者我应该使用一些非托管类型?

啊,这是一个vb6,而不是vbscript。

太感谢了

对于那些寻求答案的人:

 public SomeObjectComVisible GetThat([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)]byte[] array) 

问题在于数组。 http://msdn.microsoft.com/en-us/library/z6cfh6e6.aspx和http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx

任何非bittable类型都可以是一件苦差事。 您可以指定自己的类型,以便使用它们,您只需要使用它们

 [ComVisible(true), ClassInterface(ClassInterfaceType.None), ProgId("SomeNamespace.SomeClass"), Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")] 

在课堂上

非常感谢大家。

很好的帮助

在处理我的.Net代码的COM客户端时,我经常遇到arrays编组问题。 我发现这篇文章对于帮助我理解这个过程非常有用。

Blittable和Non-Blittable类型

具体来说,你可以看看这篇谈论数组的文章

注意:我的原始答案的一部分,我们发现是不正确的

所以从看看它看起来像“ 字节 ”不是可以搞定的“ 字节 ”是。 如果切换到Byte [],它可能会按照您期望的方式工作。 注意:char不是blitable但Char是。

试试这个:-

 [ComVisible(true)] public SomeObjectComVisible GetThat([MarshalAs(UnmanagedType.AsAny)] byte[] array){ ... } 

如果这不起作用,您可以尝试使用UnmanagedType枚举的不同值来查看是否可以找到有效的值。

或者,您可能必须将参数标记为ref,即

 [ComVisible(true)] public SomeObjectComVisible GetThat(ref byte[] array){ ... } 

(或者也许是以上的组合。)

注意 – 确保在每次更改后重新生成.tlb文件。

非常老的线程,但对于VB.NET到VB6,例如ByRef字节作为Byte()起作用。 如果省略ByRef并且字节传递ByVal(默认值),VB6将抛出“标记为受限制的函数或使用Visual Basic中不支持的类型”错误。