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

mar*_*raz 4 .net c# vb6 interop

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

[ComVisible(true)]
public SomeObjectComVisible GetThat(byte[] array){ ... }
Run Code Online (Sandbox Code Playgroud)

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

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

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

太感谢了

对于那些寻求答案的人:

public SomeObjectComVisible GetThat([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)]byte[] array)
Run Code Online (Sandbox Code Playgroud)

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

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

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

在课堂上

非常感谢大家.

很好的帮助

Joh*_*ski 8

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

Blittable和Non-Blittable类型

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

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

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


Ada*_*lph 6

试试这个:-

[ComVisible(true)]
public SomeObjectComVisible GetThat([MarshalAs(UnmanagedType.AsAny)] byte[] array){ ... }
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以尝试不同的UnmanagedType枚举值,看看是否可以找到一个有效的值.

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

[ComVisible(true)]
public SomeObjectComVisible GetThat(ref byte[] array){ ... }
Run Code Online (Sandbox Code Playgroud)

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

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