如何将C#的string[]正确封送到VBScript中?
解决方案
要解决VBScript能识别数组但无法访问元素的问题,必须在COM可见接口的属性定义上显式指定封送规则,而非仅在实现类中添加属性。
原因
COM互操作中,.NET原生的string[]封送逻辑无法让VBScript正确解析数组元素。需要明确告诉CLR将数组封送为SafeArray类型,且元素类型为VT_BSTR(COM标准字符串类型)。由于COM依赖接口元数据进行类型交互,这个封送属性必须定义在接口上,实现类无需额外标注。
修改后的接口代码
[Guid("25267107-CFD3-4A1B-8D94-639A7F189C0B"), InterfaceType(ComInterfaceType.InterfaceIsDual), ComVisible(true)] public interface IComMethods : IDisposable { [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] string[] Interlockings { get; } }
实现类代码保持不变
public string[] Interlockings { get { return new string[] { "abc", "def" }; } }
注意事项
修改接口后,需要重新注册程序集以更新COM元数据:
regasm.exe /codebase YourAssembly.dll
此时原VBScript代码无需修改,即可正常访问数组中的每个元素。
内容的提问来源于stack exchange,提问作者suriel
相关产品推荐
相关产品推荐

