我正在尝试使用来自C#的COM接口,它暴露了由tlbimp生成的以下接口:
[Guid("7DDCEDF4-3B78-460E-BB34-C7496FD3CD56")]
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
public interface IFred
{
[DispId(1)]
IBarney Pall { get; set; }
}
[Guid("E390230E-EE9C-4819-BC19-08DAB808AEA9")]
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
public interface IBarney
{
[DispId(1)]
double Wilma { get; set; }
}
生成的包装程序集不包含IBarney
接口的实现。我已经创建了一个C#结构来实现IBarney
接口,如下所示:
[Guid("2C61BA37-7047-43DB-84B1-83B4268CF77B")]
[ComVisible(true)]
public struct Barney : IBarney
{
public double Wilma { get; set; }
}
现在的问题是“有效”,Barney
实例是按值还是通过引用进行编组的?由于涉及网络开销,这很重要。理想情况下执行以下内容:
fredInstance.Pall = new Barney { Wilma = 0.37 };
将导致单个网络往返。我如何验证这一点,或者我如何告诉COM互操作我的Barney
结构应该始终按值进行编组?
鉴于Hans Passant的评论。设计这个的“正确”方法是什么?允许简单结构作为COM接口的“属性”值使用的IDL是什么?查看生成接口的IDL,我当前正在使用添加带有默认coclass
接口的IBarney
声明就足够了,对吗?