我正在尝试使用从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
接口的实现。我创建了一个实现 IBarney
接口的 C# 结构,如下所示:[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,添加具有默认IBarney
接口的coclass
声明就足够了,对吗?