c# - 按值将 C# 对象传递给 COM

标签 c# com marshalling com-interop

我正在尝试使用 C# 中的 COM 接口(interface),它公开了由 tlbimp 生成的以下接口(interface):

[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 接口(interface)的实现。我创建了一个实现 IBarney 接口(interface)的 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 接口(interface)“属性”的值所需的 IDL 是什么?查看我当前正在使用的生成接口(interface)的 IDL,添加一个带有默认 IBarney 接口(interface)的 coclass 声明就足够了,对吧?

最佳答案

一些评论...不知道这是否会是一个答案...

1) 我认为你应该让你的界面 [ComVisible(true)]

2) 为什么将 Barney 定义为结构体?它应该是一个类。与 C++ 中类和结构之间的唯一区别是私有(private)成员与公共(public)成员的默认值不同,C# 结构和类根本不同。

关于c# - 按值将 C# 对象传递给 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36496202/

相关文章:

c# - 如何在学校的 Linux 服务器上运行 C# 程序?

c++ - 我如何强制客户端调用显式专用模板而不是主模板?

c++ - 用于进程间通信的 ActiveX 和 COM

c# - 使用 P-Invoke 将字符串数组从托管 C# 传递到非托管函数

c# - OracleParameter.Size 有什么影响?

c# - 避免在泛型方法中进行过多的类型检查?

c# - 拒绝访问 Kiosk 程序进程

c# - 通过 COM 接口(interface)时出错

java - 具有多个同名 setter 的 JAXB 行为编码(marshal)类

java - 在不同环境中转换 ElementNSImpl 的问题