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.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")]
Run Code Online (Sandbox Code Playgroud)
在课堂上
非常感谢大家.
很好的帮助
在处理我的.Net代码的COM客户端时,我经常遇到阵列编组问题.我发现这篇文章对于帮助我理解这个过程非常有用.
注意:我的原始答案的一部分,我们发现是不正确的
所以从看起来看起来" 字节 "不是可以搞定的" 字节 " 而已.如果切换到Byte [],它可能会按照您期望的方式工作.注意:char不是blitable但Char是.
试试这个:-
[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文件.
| 归档时间: |
|
| 查看次数: |
3646 次 |
| 最近记录: |